C语言踩坑之无符号和有符号相遇

C语言踩坑之无符号和有符号相遇

##32位机,visual studio code##
(注意,我的编译的软件是visual studio code,不同编译软件有符号和无符号运算结果可能会有差异。。。。。。我也是挺无语的)

最近踩到了一个坑,C语言有符号和无符号数据相遇的情况 :
1.运算
2.判断

直接上图:
C语言踩坑之无符号和有符号相遇

有符号的a,和无符号的b,可以看到:

  1. result1结果显示(a>b)?a:b的最终结果为a的值-2,说明三元表达式的执行结果是a的值大于b的值,但是为什么-2会大于1呢?原因就是C语言在判断的时候将a的值转换成了无符号的值,-2的十六进制为0xFFFF FFFE,1则是0x0000 0001,按照无符号作比较的话当然是a大于b了。
  2. result2非常容易使人迷惑,可能有人会和result1的过程搞混。在这里的结果为1,说明-2>1的结果为假,并没有发生无符号和有符号之间的转变,因为C语言默认的整型是int类型,是带符号的(顺便提一下,C语言默认字符是char型,默认浮点数为double型)。
  3. result3同result2
  4. a+b的结果为-1,验证了有符号和无符号在计算中会转换成有符号计算(如果转换成了无符号的话,结果是将一个非常大的值 , 为unsigned int的最大值0xFFFF FFFF,2^32-1)。

不足之处请各位大佬指正!!!!