jm1*_*890 11 c c++ types bit-manipulation
我该如何解释以下行为?
#include<iostream>
using namespace std;
int main(){
unsigned char a = 8;
cerr << "a: " << (int)a << '\n';
unsigned char b = (~a) >> 6;
cerr << "b: " << (int)b << '\n';
unsigned char c = (~a);
c = c >> 6;
cerr << "c: " << (int)c << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
a: 8
b: 255
c: 3
Run Code Online (Sandbox Code Playgroud)
经过进一步的测试,似乎(~a)变成了int而不是unsigned char.这就是为什么它1会被转移的原因.
这是怎么回事?
编辑:我的编译器只是标准的gcc 4.1.2
Hen*_*olm 22
C中的所有算术运算符和按位运算符总是将它们的参数扩展到至少int它们原来是较短的整数类型.这就是语言的定义方式.语言规范称之为"整体推广".
(其根本原因是为了更容易在架构上实现C,其中硬件不支持比完整机器字更短的数量的有效操作.当然,它也部分仅仅因为它一直以这种方式工作而不能改变而不会破坏很多依赖于此行为的现有代码).