有符号数和无符号数相互转换问题
平时工作中有符号数用的少,昨天同事在现场更改代码需要用到有符号数,发回家里后一下子我也有点晕,又查查资料在IAR和VS中也验证了下,做好
如下记录。
C语言中无符号数和有符号数一起比较、运算时,有符号数会隐式转换到无符号数。
1.无符号数--->有符号数
首先判断无符号数的最高位是否为1,如果不为1,则有符号数就直接等于无符号数;如果为1,则将无符号数取补码,得到的数就是有符号数。
本质上就是无符号数在存储器中的二进制数直接按照有符号数来解析。
现象上也可理解为无符号数先看成有符号数然后取补码。因为取补码时符号位不变,正数的补码就是原码。
以unsigned char 和 signed char为例子:
定义 unsigned char ui; signed char si;
1.1 将无符号数2转为有符号数
前提:
ui = 2;
si = ui;
结果:
si = 2;
2的原码是:0000 0010,最高位不为1,因此si = 0000 0010。
1.2 无符号数130转为有符号数
前提:
ui = 130;
si = ui;
结果:
si = -126;
130的原码是:1000 0010,最高位为1,对其取补码为1111 1110,所以si = 1111 1110 值得到的结果是-126。
2.有符号数--->无符号数
首先判断有符号数的最高位是否为1,如果不为1,则无符号数就直接等于有符号数;如果有符号数的最高位为1,则将有符号数取补码,得到的数就是
无符号数。
本质上是有符号数在存储器中的二进制数直接按照无符号数来解析,
2.1 将有符号数3转为无符号数
前提:
si = 2;
ui = si;
结果:
ui = 2;
2的原码是:0000 0010,可知最高位不为1,因此ui = 0000 0010。
2.2 将有符号数-2转为无符号数
-2的在存储器中按补码存放的,二进制表示为:1111 1110,此二进制数按照无符号数解析也就是首位不再表示符号则该值为254。
前提:
si = -2;
ui = si;
结果:
ui = 254;
另外,上述以char举例,如果换成short或者int等等,要注意只有首位才是符号位。