为什么签名短扩展到4个字节?

时间:2014-10-15 18:53:46

标签: 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{
        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个字节。

2 个答案:

答案 0 :(得分:2)

"%x" printf格式代码适用于int而不是short,因为您需要"%hx"

答案 1 :(得分:1)

首先,short类型可以是编译器想要的任何大小,在C规范的限制范围内,因此short变量不能保证正好是2个字节大小。

您所看到的是通过向上转换为更大的数字类型而导致的符号扩展

在二进制补码中转换为带符号的2字节数的0xffff数字表示数字-1。当您将其转换为更大的数据类型时,数值是需要保留的值,因此符号被扩展; 0xffffffff转换为带符号的4字节数字也是-1。 (0x0000ffff强制转换为带符号的4字节数字为65,535,这个数字不同。)