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.
"Integer Promotion" 应用于 <<
运算符的两个运算符。
那么移位就完成了
后面跟上一个运算结果的“Implicit Conversion”到赋值运算符的"Left-Hand-Side"值的类型。
这是我的代码
#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
.
您可以通过检查 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.
"Integer Promotion" 应用于
<<
运算符的两个运算符。那么移位就完成了
后面跟上一个运算结果的“Implicit Conversion”到赋值运算符的"Left-Hand-Side"值的类型。