搜索
bottom↓
回复: 14

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

[复制链接]

出0入4汤圆

发表于 2019-12-15 22:33:51 | 显示全部楼层 |阅读模式
本帖最后由 SCREA 于 2019-12-16 17:43 编辑
  1. unsigned char 1 > char -2         = 1

  2. unsigned int 1 > int -2         = 0

  3. unsigned char 1 > int -2         = 1

  4. unsigned int 1 > char -2         = 0

  5. unsigned char 1 + int -2         = -1

  6. unsigned int 1 + int -2         = -1

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



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

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2019-12-16 09:38:47 | 显示全部楼层
不同类型为什么要直接比,项目中的不定情况要自己控制,不要交给编译器

出0入0汤圆

发表于 2019-12-16 09:43:08 | 显示全部楼层
以前吃过亏,就是判断是否相等,即使这两个变量在内存中的2进制是一模一样的,但如果你赋予的符号类型不一样,仍然判断为不相等。

出0入4汤圆

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

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

出0入0汤圆

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

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

出0入4汤圆

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

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

出0入0汤圆

发表于 2019-12-16 12:22:23 | 显示全部楼层
和编译器有关, 看编译器 是否 宽度匹配 和 符号匹配。以及 有符号和符号的优先级。

出0入0汤圆

发表于 2019-12-16 14:32:18 | 显示全部楼层
读书百遍,其意自现

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-12-16 15:14:47 | 显示全部楼层
都提升成int了,所以第一个才是TRUE。

出0入0汤圆

发表于 2019-12-16 16:39:07 | 显示全部楼层
眼花了吗?

unsigned int 1 + int -2         = -1

unsigned int 1 + int -2         大于0

出0入0汤圆

发表于 2019-12-16 18:40:22 | 显示全部楼层
跟打括号一样,显式避开不同类型的比较

出0入76汤圆

发表于 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");

出10入120汤圆

发表于 2019-12-18 10:21:57 | 显示全部楼层
不干这些省事的小技巧,一般都是转换成一样类型的做比较,和11楼说的一样,显式一眼看明白比什么都重要。

出0入0汤圆

发表于 2019-12-18 12:34:27 来自手机 | 显示全部楼层
整型提升

出0入0汤圆

发表于 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位加减法其实不需要关心符号,最后结果都是一样的,只是看你把结果认为成有符号还是无符号。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-3 00:47

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表