C 为什么有符号短扩展到4字节?
下面我有一个简短的程序,它做了一些显式的转换C 为什么有符号短扩展到4字节?,c,types,casting,C,Types,Casting,下面我有一个简短的程序,它做了一些显式的转换 #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{
#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;
}
我很困惑为什么y变成0xffffffff,当它被转换成符号短。短类型应该是2个字节而不是4个字节。格式代码是用于
int
而不是Short
,因为您需要%hx”首先,Short
类型可以是编译器想要的任何大小,在C规范的限制范围内,因此short
变量的大小不能保证正好为2字节
您看到的是一个符号扩展,它是由向上转换为更大的数字类型引起的
数字0xffff
转换为2的补码中的有符号2字节数字,表示数字-1。当您将其转换为更大的数据类型时,数字值是需要保留的,因此符号被扩展0xFFFFFF
强制转换为带符号的4字节数字也是-1。(0x0000ffff
强制转换为有符号的4字节数字将是65535,这不是同一个数字。)printf()不是调试器。x>(有符号短)y
可能不是您认为它的意思。因此对于行“x>(有符号短)y”,y首先转换为“有符号短”类型,它在内存中保留0xffff(-1)。然后y隐式转换为“unsigned int”。因此,y变成“int”0xFFFFFF(=-1),然后变成“unsigned int”0xFFFFFF(=UTMax)。我这样想对吗?
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