以下计划
short b =-10;
printf("%x %d",b,sizeof(b));
输出(vs vs 2008)
FFFFFFF6 2
为什么不
FFF6 2
与签名字符相同。
答案 0 :(得分:5)
这是由于整数类型促销。
你的短裤被隐含地提升为int。 (这里是32位)所以这些是签名扩展促销。
因此,你的printf()打印出完整32位int的十六进制数字。
当您的短值为负数时,符号扩展名将使用1填充前16位,因此您获得fffffff6而不是fff6。
格式字符串中的占位符%x将相应的参数解释为unsigned int。
要将参数打印为short,请在占位符中添加长度修饰符h:
printf("%hx", hex);
这里h表示转换将是d x o u x或n之一 并且下一个指针是指向short int或unsigned short int的指针 (而不是int)。
codepad link:http://codepad.org/aX2MzY0o
请参阅:http://en.wikipedia.org/wiki/Printf_format_string#Format_placeholders
答案 1 :(得分:0)
因为它被提升为int数据类型。表达式sizeof(type) * CHAR_BIT
的计算结果足以包含所需的范围。
另请注意,short可能更窄,但也可能与int相同。始终保证int等于或大于short int。
CPU short int
8 bit 16 16
16 bit 16 16
32 bit 16 32
64 bit 16 32