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
===========
大家要在自己项目中实测。与编译器和芯片都有关系 不同类型为什么要直接比,项目中的不定情况要自己控制,不要交给编译器 以前吃过亏,就是判断是否相等,即使这两个变量在内存中的2进制是一模一样的,但如果你赋予的符号类型不一样,仍然判断为不相等。 wuha 发表于 2019-12-16 09:43
以前吃过亏,就是判断是否相等,即使这两个变量在内存中的2进制是一模一样的,但如果你赋予的符号类型不一 ...
会不会是进行了扩展?
按道理,在内存中,应该都是使用的比较或减法指令,然后判断标志位来确定是否相等的
laujc 发表于 2019-12-16 10:05
会不会是进行了扩展?
按道理,在内存中,应该都是使用的比较或减法指令,然后判断标志位来确定是否相等 ...
我也想不通,但是就是遇到了一次,比较一个8位有符号变量与一个数字的相等,该数字已经超127了,始终判断为不相等,后来变量前面加了强制转换为无符号8位,就判断相等了。 wuha 发表于 2019-12-16 10:20
我也想不通,但是就是遇到了一次,比较一个8位有符号变量与一个数字的相等,该数字已经超127了,始终判断 ...
感觉应该是编译器将类型提升了
即将8位提升为16位再运算了
和编译器有关, 看编译器 是否 宽度匹配 和 符号匹配。以及 有符号和符号的优先级。 读书百遍,其意自现
都提升成int了,所以第一个才是TRUE。 眼花了吗?
unsigned int 1 + int -2 = -1
unsigned int 1 + int -2 大于0
跟打括号一样,显式避开不同类型的比较 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");
不干这些省事的小技巧,一般都是转换成一样类型的做比较,和11楼说的一样,显式一眼看明白比什么都重要。 整型提升 foxpro2005 发表于 2019-12-18 10:16
估计你没有看原帖,printf的格式%d,是输出的有符号数
1) printf("unsigned int 1 + int -2 \t= %d \r\n ...
明白了。
32位加减法其实不需要关心符号,最后结果都是一样的,只是看你把结果认为成有符号还是无符号。
页:
[1]