为什么声明为unsigned int的变量生成负值?

时间:2017-07-04 00:15:44

标签: c bit-shift

我写了这段代码来了解位移。令我惊讶的是,即使我将x声明为unsigned int,输出也包含一个负数,即当最左边的位设置为1.我的问题:为什么?我认为unsigned int永远不会消极。每sizeof(x)x宽度为4个字节。

这是代码片段:

int main(void)
{
    unsigned int x;

    x = 1;

    for (int i = 0; i < 32; i++)
    {
        printf("2^%i = %i\n", i, x);
        x <<= 1;
    }


    return 0;
}

这是输出:

2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^5 = 32
2^6 = 64
2^7 = 128
2^8 = 256
2^9 = 512
2^10 = 1024
2^11 = 2048
2^12 = 4096
2^13 = 8192
2^14 = 16384
2^15 = 32768
2^16 = 65536
2^17 = 131072
2^18 = 262144
2^19 = 524288
2^20 = 1048576
2^21 = 2097152
2^22 = 4194304
2^23 = 8388608
2^24 = 16777216
2^25 = 33554432
2^26 = 67108864
2^27 = 134217728
2^28 = 268435456
2^29 = 536870912
2^30 = 1073741824
2^31 = -2147483648

4 个答案:

答案 0 :(得分:4)

只需使用正确的转换符号

即可
printf("2^%u = %u\n", i, x);

答案 1 :(得分:3)

您正在使用%i格式说明符,该说明符将其参数打印为带符号的int

如果要打印为无符号,请使用%u格式说明符。

printf("2^%i = %u\n", i, x);

答案 2 :(得分:3)

当你谈到C(C ++和许多其他编程语言)中的整数值的符号时,你只是在谈论如何解释某些数据。

你必须明白,unsigned int中存储的内容只是位而不管符号,使用时它们表现为“无符号”这一事实仅仅是对值的解释。

因此,通过使用%i说明符,您将其视为有符号值,无论其如何声明。尝试使用%u,指定您要将其视为unsigned

答案 3 :(得分:1)

根据printf上的C ++参考页面,在传递给printf的字符串中使用%i意味着相应的参数将被视为 signed 十进制整数。这意味着unsigned int将被转换为signed int。 在C ++中,将unsigned转换为signed(和reverse)只会改变解释,而不是位值。因此,将最左边的位设置为1会使数字为负,因为这与有符号整数解释中的对应关系。 要达到预期的数字,请使用%u代替无符号整数解释。