unsigned char 的大小是 8 位,但为什么我可以将它(向左或向右)移动 31 位或最多 31 位?

Size of unsigned char is 8 bits but why can I shift it (left or right) by or upto 31 bits?

这是我的代码

#include <stdio.h>                  
int main(void) {
    unsigned char ch = 244;      
    ch = ch << 31;                   
    return 0;
}

我可以将 ch 移动到 31 位,这意味着 ch 是 32 位,但是怎么做呢? sizeof(ch) 也只有 1 个字节。

[...] that means ch is of 32 bits [...] ?

不是。 int 类型的移位结果在分配回 ch.

时被截断为 8 位

您可以通过检查 ch 的值来验证这一点。

如果 -Wconversion 打开,

gcc 会发现这个:

$ gcc -Wconversion test.c
test.c:4:13: warning: implicit conversion loses integer precision: 'int' to 'unsigned char' [-Wconversion]
    ch = ch << 31;
       ~ ~~~^~~~~
1 warning generated.
  1. "Integer Promotion" 应用于 << 运算符的两个运算符。

  2. 那么移位就完成了

  3. 后面跟上一个运算结果的“Implicit Conversion”到赋值运算符的"Left-Hand-Side"值的类型。