13

在 (char) 0xff 左移 8 并将其转换为 int 时,我们得到 -256 或 0xffffff00。有人可以解释为什么会发生这种情况吗?

#include <stdio.h>
int main (void)
{   
    char c = 0xff;
    printf("%d %x\n", (int)(c<<8),(int)(c<<8));
    return 0;
}

输出是

-256 ffffff00
4

4 回答 4

16

char可以有符号或无符号 - 它是实现定义的。您会看到这些结果,因为char默认情况下已在您的编译器上签名。

对于有符号字符,0xFF 对应于 -1(这就是二进制补码的工作方式)。当您尝试对其进行移位时,它首先被提升为 an int,然后被移位 - 您实际上得到了 256 的乘法。

所以它是这个代码:

char c = 0xFF; // -1
int shifted = c << 8; //-256 (-1 * 256)
printf( "%d, %x", shifted, shifted );
于 2009-07-08T10:00:53.357 回答
11

When I first looked at the problem, my initial view was that the char 'c' should be shifted left 8 bits - all 8 bits being discarded, the empty char would then be cast to an int of value 0.

A bit of research reveals Usual Unary Conversions - this is where to reduce the large number of arithmetic types, conversions are applied automatically to operands of the unary '!', '-', '~' and '*' operators, and to each of the operands of the binary '<<' and '>>' operators.

Therefore the char 'c' is converted to an int first, then shifted left, giving the answer you see.

You learn something new every day!

于 2009-07-08T10:12:15.593 回答
3

c 在移位操作完成之前被提升为 int。假设您的实现默认使字符签名,这意味着您将获得 0xffffffff,然后将其向左移动以给出您的结果。

如果你把 c 变成一个 unsigned char,你应该得到你所期望的。

于 2009-07-08T10:02:21.653 回答
0

char 只不过是有符号的 char。所以 char c = 0xFF 将是 -1 。当你将 -1 左移 8 位时,你得到 -256。

于 2009-07-08T10:00:24.807 回答