首页 > 解决方案 > unsigned char 的大小是 8 位,但为什么我可以将它(左或右)移动或最多 31 位?

问题描述

所以这是我的代码

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

我最多可以移动ch31 位,这意味着ch32 位,但是如何? sizeof(ch)也只有 1 个字节。

标签: cimplicit-conversioninteger-promotion

解决方案


[...] 这意味着ch是 32 位 [...] ?

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

您可以通过检查 的值来验证这一点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.

推荐阅读