SCREA 发表于 2019-12-15 22:33:51

C语言 有符号和无符号做比较

本帖最后由 SCREA 于 2019-12-16 17:43 编辑

unsigned char 1 > char -2         = 1

unsigned int 1 > int -2         = 0

unsigned char 1 > int -2         = 1

unsigned int 1 > char -2         = 0

unsigned char 1 + int -2         = -1

unsigned int 1 + int -2         = -1

unsigned int 1 + int -2         大于0
————————————————
版权声明:本文为CSDN博主「光明磊」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/happygaohualei/article/details/86078182


===========
大家要在自己项目中实测。与编译器和芯片都有关系

mcu5i51 发表于 2019-12-16 09:38:47

不同类型为什么要直接比,项目中的不定情况要自己控制,不要交给编译器

wuha 发表于 2019-12-16 09:43:08

以前吃过亏,就是判断是否相等,即使这两个变量在内存中的2进制是一模一样的,但如果你赋予的符号类型不一样,仍然判断为不相等。

laujc 发表于 2019-12-16 10:05:32

wuha 发表于 2019-12-16 09:43
以前吃过亏,就是判断是否相等,即使这两个变量在内存中的2进制是一模一样的,但如果你赋予的符号类型不一 ...

会不会是进行了扩展?
按道理,在内存中,应该都是使用的比较或减法指令,然后判断标志位来确定是否相等的

wuha 发表于 2019-12-16 10:20:03

laujc 发表于 2019-12-16 10:05
会不会是进行了扩展?
按道理,在内存中,应该都是使用的比较或减法指令,然后判断标志位来确定是否相等 ...

我也想不通,但是就是遇到了一次,比较一个8位有符号变量与一个数字的相等,该数字已经超127了,始终判断为不相等,后来变量前面加了强制转换为无符号8位,就判断相等了。

laujc 发表于 2019-12-16 11:05:11

wuha 发表于 2019-12-16 10:20
我也想不通,但是就是遇到了一次,比较一个8位有符号变量与一个数字的相等,该数字已经超127了,始终判断 ...

感觉应该是编译器将类型提升了
即将8位提升为16位再运算了

zhonghua_li 发表于 2019-12-16 12:22:23

和编译器有关, 看编译器 是否 宽度匹配 和 符号匹配。以及 有符号和符号的优先级。

panda1985 发表于 2019-12-16 14:32:18

读书百遍,其意自现

zhugean 发表于 2019-12-16 15:14:47

都提升成int了,所以第一个才是TRUE。

shiva_shiva 发表于 2019-12-16 16:39:07

眼花了吗?

unsigned int 1 + int -2         = -1

unsigned int 1 + int -2         大于0

huangqi412 发表于 2019-12-16 18:40:22

跟打括号一样,显式避开不同类型的比较

foxpro2005 发表于 2019-12-18 10:16:50

shiva_shiva 发表于 2019-12-16 16:39
眼花了吗?

unsigned int 1 + int -2         = -1


估计你没有看原帖,printf的格式%d,是输出的有符号数

1) printf("unsigned int 1 + int -2 \t= %d \r\n", (uint_num + sint_num));    此处在计算时 (uint_num + sint_num) 是将sint_num转换为unsigned int计算的,但在ptrintf输出时%d又是按有符号数输出的,所以显示的是-1

2)        if((uint_num + sint_num) > 0)    // (uint_num + sint_num)这里是unsigned int 无符号数的结果值 与 0(也是转换为unsigned int无符号数的)的比较,所以是大于0
                printf("unsigned int 1 + int -2 \t大于0\r\n");
        else
                printf("unsigned int 1 + int -2 \t小于0\r\n");

makesoft 发表于 2019-12-18 10:21:57

不干这些省事的小技巧,一般都是转换成一样类型的做比较,和11楼说的一样,显式一眼看明白比什么都重要。

wzd5230 发表于 2019-12-18 12:34:27

整型提升

shiva_shiva 发表于 2019-12-18 14:08:27

foxpro2005 发表于 2019-12-18 10:16
估计你没有看原帖,printf的格式%d,是输出的有符号数

1) printf("unsigned int 1 + int -2 \t= %d \r\n ...

明白了。
32位加减法其实不需要关心符号,最后结果都是一样的,只是看你把结果认为成有符号还是无符号。
页: [1]
查看完整版本: C语言 有符号和无符号做比较