如何解释以下行为?
#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;
}
输出:
a: 8
b: 255
c: 3
进一步测试后发现,(~a)
变成了 int
而不是 unsigned char
,这就是为什么会出现 1
的位移。
到底发生了什么?
编辑:我的编译器只是标准的 gcc 4.1.2 版本。
”运算符的结果是其(提升后的)操作数的按位补码(即,如果转换后的操作数中对应的位未设置,则结果中的每个位都被设置)。操作数进行整数提升,并且结果具有提升类型。如果提升类型是无符号类型,则表达式“E”等效于该类型中可表示的最大值减去“E”。 - Adam Rosenfield