按位NOT(〜)的奇怪行为

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,其中硬件不支持比完整机器字更短的数量的有效操作.当然,它也部分仅仅因为它一直以这种方式工作而不能改变而不会破坏很多依赖于此行为的现有代码).

  • 答案中应提及"促销"一词. (2认同)
  • 和C99§6.5.3.3/ 4:"〜"运算符的结果是其(提升的)操作数的按位补码(也就是说,当且仅当转换后的操作数中的相应位时,结果中的每个位都被置位)未设置).整数提升在操作数上执行,结果具有提升类型.如果提升类型是无符号类型,则表达式"~E"等于该类型中可表示的最大值减去`E `". (2认同)