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