无符号字符的大小为8位,但是为什么我可以将其(左或右)移位最多31位?

时间:2019-07-20 11:26:19

标签: c implicit-conversion integer-promotion

这是我的代码

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

我可以将ch最多移位31位,这意味着ch是32位,但是怎么办? sizeof(ch)也是1个字节。

2 个答案:

答案 0 :(得分:4)

  

[...]表示ch是32位[...]吗?

不是。类型为int的移位结果在分配回ch时将被截断为8位。

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

gcc会在-Wconversion打开的情况下发现此问题:

$ 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 :(得分:3)

  1. Integer Promotion”应用于myArray运算符的两个运算符。

  2. 然后完成转移。

  3. 后跟前一个操作结果的“ Implicit Conversion”,即赋值运算符的“ Left-Hand-Side”值的类型。