C++中按位运算符的结果

And*_*rew 10 c++

测试几个编译器(Comeau,g ++)确认某些"整数类型"的按位运算符的结果是int:

void foo( unsigned char );
void foo( unsigned short );

unsigned char a, b;

foo (a | b);
Run Code Online (Sandbox Code Playgroud)

我希望"a | b"的类型是unsigned char,因为两个操作数都是unsigned char,但是编译器说结果是int,而对foo()的调用是不明确的.为什么设计语言以使结果为int,或者此实现是否依赖?

谢谢,

In *_*ico 9

这实际上是标准的C++行为(ISO/IEC 14882):

5.13/1按位包含OR运算符

执行通常的算术转换; 结果是其操作数的按位包含OR函数.运算符仅适用于整数或枚举操作数.

5/9通常的算术转换

许多期望算术或枚举类型的操作数的二元运算符会以类似的方式引起转换并产生结果类型.目的是产生一个通用类型,它也是结果的类型.此模式称为通常的算术转换,其定义如下:

  • 如果任一操作数是类型long double,则另一个操作数应转换为long double.
  • 否则,如果任一操作数是double,则另一个操作数应转换为double.
  • 否则,如果任一操作数是float,则另一个操作数应转换为float.
  • 否则,应对两个操作数执行整体促销.
  • ...

4.5/1积分促销

类型的右值char,signed char, unsigned char,short int,或unsigned short int可被转化为式的一个右值int如果int可以表示源类型的所有值; 否则,源rvalue可以转换为类型的右值unsigned int.

我认为它与int所谓的执行环境的"自然"大小有关,以允许有效的算术(参见Charles Bailey的答案).

  • @Merlyn Morgan-Graham:不,本文中的所有"可以"都来自这部分规范对这类实现细节的依赖,即"较小"类型的范围.但促销本身是不可避免的.C/C++*从不*对小于`int` /`unsigned int`的类型执行算术运算. (2认同)