[求助] 一个奇怪的问题,一个有符号的32位数与一个无符号的32号位比较大小的结果 是错误的

一沙一世   2022-6-11 18:40 楼主

一个奇怪的问题,一个有符号的32位数与一个无符号的32号位比较大小的结果 是错误的,下图中 je=-3  ,sbsj.baojing2=0  , 按说 if (je <=sbsj.baojing2) 比较后应该执行(1)处的代码,而现在的结果却是执行 (2)处的代码 即ELSE后的代码,请问是何原因,如何处理。

 

image.png  

回复评论 (15)

图中已经明确表示出来了。-3是0xFFFFFFFD,作为无符号数当然大于0。

点赞  2022-6-11 18:54

數字比較應該在同一個型別上才是.

這沒有甚麼奇怪的,就是不同型別的錯誤比較而已.

点赞  2022-6-11 23:24

不算奇怪,就是C语言的隐式类型转换,,对照下边的几条规则就知道为啥了。。。

 

image.png  

坐而言不如起而行
点赞  2022-6-11 23:27
引用: maychang 发表于 2022-6-11 18:54 图中已经明确表示出来了。-3是0xFFFFFFFD,作为无符号数当然大于0。

je  是  int 不是 uint 

点赞  2022-6-12 06:34
引用: wsmysyn 发表于 2022-6-11 23:27 不算奇怪,就是C语言的隐式类型转换,,对照下边的几条规则就知道为啥了。。。    

非常感谢。那我遇到的这种情况是属于(5)还是(7)这种情况呢,具体发生了什么情况呢

点赞  2022-6-12 06:40
引用: 一沙一世 发表于 2022-6-12 06:34 je  是  int 不是 uint 

问题就在于 je 是 int,而 baojing2 是 uint。这在你的图片中表示得很清楚不同类型的数,不能进行比较,否则可能出错。

你如果比较图中 maxdl2 和 baojing2,就不会出错,因为这两个同是 uint类型。

点赞  2022-6-12 08:08
引用: 一沙一世 发表于 2022-6-12 06:34 je  是  int 不是 uint 

4楼说得很清楚:必须将两个数转换成同样类型,才可以进行比较。

点赞  2022-6-12 08:10

本身把有符号数和无符号数比较就是脑袋有坑,学编程最基本的知识就是数据类型的定义,更何况是嵌入式编程!找几本免费的C语言教程很难吗?花时间学习一下不比在这里问更好吗。

点赞  2022-6-12 10:49

确实不算奇怪,就像32和"A“那个大,这和人的理解是不同的。

چوآن شـين
点赞  2022-6-12 11:03
引用: wsmysyn 发表于 2022-6-11 23:27 不算奇怪,就是C语言的隐式类型转换,,对照下边的几条规则就知道为啥了。。。    

感谢。还有个问题问一下,您这图是从哪本教材上截取的,我这儿几本书上都没写这么细致。

点赞  2022-6-12 11:11
引用: 一沙一世 发表于 2022-6-12 11:11 感谢。还有个问题问一下,您这图是从哪本教材上截取的,我这儿几本书上都没写这么细致。

不是书上的,百度一下隐式类型转换规则就行,

坐而言不如起而行
点赞  2022-6-12 12:02
引用: wsmysyn 发表于 2022-6-12 12:02 不是书上的,百度一下隐式类型转换规则就行,

非常感谢。

点赞  2022-6-12 14:19

同类型比较才有意义,不同的话,我个人理解,例如四位的 有符号就是-7-6-5-4-3-2-101234567

0000  ->  0

0111  ->  7

1111  -> -7

1010  -> -2

.......

意思是第一位是符号位

无符号数

1111  ->  15

0000  -> 0

1010  ->  10

如果你的数小一点都是正的,兴许也能比大小(我猜的),但是一旦大到符号位是1了,那恐怕不能比较了哈。所以有无符号可是差别蛮大的。不知道我说的对不对啊?

点赞  2022-6-12 21:35

拿不准就手动改一样的类型再比较(int)x == (int)y 这种。

默认摸鱼,再摸鱼。2022、9、28
点赞  2022-6-15 19:54
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复