您的位置:首页 > 其它

Signed 与 Unsigned 之间的转换

2013-05-04 17:07 211 查看
今天师兄拿腾讯今年招实习生的笔试题给我问我下面这道题答案是什么:
signed char a = 0xe0;
unsigned int b = a;
unsigned char c = a;
下面说法正确的是:
A:(a>0)&& (b>0)B:(c == 0 )为真 C:b的十六进制为0xffffffe0 D:以上说法都不对
答案应该是选C的。
首先signed char 是一个字节大小,最高位为符号位,显然a<0;c==0这个一看就是错的。

这个题显然是考的signed与Unsigned的转换问题,看下面小程序:

unsigned char a = -1;
signed char b = a;
printf("%d%d",a,b);
答案是 255,-1
在计算机里用补码存储数值,那么-1在内存中是0xffffffff,取后八位赋给a和b,即0xff。在printf的时候a和b要转为int输出,因为a是无符号的所以输出为255,b为有符号的所以输出为-1。

在看下面这个小例子:

unsigned int a = -1;
int b = a;
printf("%d%d",a,b);
答案是 -1,-1
-1在内存中已经是0xffffffff,因为int与Unsigned int 大小一样,将其赋给a不用做截断,所以转为int输出时是-1,-1

关于signed与Unsigned之间相互转换的问题好多人都容易糊涂,其实记住两点:

Unsigned赋给signed 将补码直接赋给signed 高位补0,若signed位数不足则只填充Unsigned的低位。
signed赋给Unsigned 将补码直接赋给Unsigned高位按照signed的符号位填补,若signed的位数不足则只填充signed的低位。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: