这里我有一个简短的程序,下面做了一些明确的演员。
#include <stdio.h>
#include <string.h>
int main()
{
unsigned int x = 0xDEADBEEF;
unsigned short y = 0xFFFF;
printf("%x\n", y);
if (x > (signed short) y)
printf("true.\n");
else{
printf("false.\n");
printf("(signed short)=%x\n", (signed short) y);
printf("(unsigned int) (signed short)=%x\n", (unsigned int) (signed short) y);
printf("(unsigned) (signed short)=%x\n", (unsigned) (signed short)y);
}
return 0;
}
我得到了下面的输出。
Compiling the source code....
$gcc main.c -o demo
Executing the program....
$demo
ffff
false.
(signed short)=ffffffff
(unsigned int) (signed short)=ffffffff
(unsigned) (signed short)=ffffffff
我很困惑,为什么当它被转换成签名短片时,你变成了0xffffffff。短类型应该是2个字节而不是4个字节。
答案 0 :(得分:2)
"%x"
printf
格式代码适用于int
而不是short
,因为您需要"%hx"
。
答案 1 :(得分:1)
首先,short
类型可以是编译器想要的任何大小,在C规范的限制范围内,因此short
变量不能保证正好是2个字节大小。
您所看到的是通过向上转换为更大的数字类型而导致的符号扩展。
在二进制补码中转换为带符号的2字节数的0xffff
数字表示数字-1。当您将其转换为更大的数据类型时,数值是需要保留的值,因此符号被扩展; 0xffffffff
转换为带符号的4字节数字也是-1。 (0x0000ffff
强制转换为带符号的4字节数字为65,535,这个数字不同。)