有符号数和无符号数相互转换问题

备份自 http://www.cnblogs.com/wang-jingke/p/4186094.html html

平时工做中有符号数用的少,昨天同事在现场更改代码须要用到有符号数,发回家里后一会儿我也有点晕,又查查资料在IAR和VS中也验证了下,作好ui

以下记录。spa

C语言中无符号数和有符号数一块儿比较、运算时,有符号数会隐式转换到无符号数。orm

1.无符号数--->有符号数htm

首先判断无符号数的最高位是否为1,若是不为1,则有符号数就直接等于无符号数;若是为1,则将无符号数取补码,获得的数就是有符号数。
本质上就是无符号数在存储器中的二进制数直接按照有符号数来解析。
现象上也可理解为无符号数先当作有符号数而后取补码。由于取补码时符号位不变,正数的补码就是原码。blog

以unsigned char 和 signed char为例子:get

定义 unsigned char ui; signed char si;it

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。margin

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等等,要注意只有首位才是符号位。

相关文章
相关标签/搜索