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的低位。
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的低位。
相关文章推荐
- unsigned 和 signed之间的转换关系
- C语言 unsigned 和 signed 类型相互转换深入理解
- C语言 unsigned 和 signed 类型相互转换深入理解
- signed和unsigned之间
- signed和unsigned之间
- C语言中,unsigned与signed类型转换
- C语言 算术转换 unsigned signed int
- signed和unsigned之间以及移位操作相关左移和右移
- char/unsigned char/signed char之间的区别
- (转载)signed和unsigned之间
- unsigned和signed的转换
- char 和 unsigned 与int 之间的转换
- unsigned与signed之间的区别;微软试题已知unsigned int i=3;unsigned j;输出j=i*(-1)的结果详解
- 语言 unsigned 和 signed 类型相互转换深入理解
- C语言 unsigned 和 signed 类型相互转换深入理解
- C语言signed和unsigned之间的编程陷阱
- in_addr,char* ,unsigned long 之间的互相转换
- C语言 unsigned 和 signed 类型相互转换深入理解
- signed和unsigned之间
- [VC]signed和unsigned之间区别