[英]Result of bitwise operator in C++
测试几个编译器(Comeau,g ++)确认某些“整数类型”的按位运算符的结果是int:
void foo( unsigned char );
void foo( unsigned short );
unsigned char a, b;
foo (a | b);
我希望“a | b”的类型是unsigned char,因为两个操作数都是unsigned char,但是编译器说结果是int,而对foo()的调用是不明确的。 为什么设计语言以使结果为int,或者此实现是否依赖?
谢谢,
这实际上是标准的C ++行为(ISO / IEC 14882):
5.13 / 1按位包含OR运算符
执行通常的算术转换; 结果是其操作数的按位包含OR函数。 运算符仅适用于整数或枚举操作数。
5/9通常的算术转换
许多期望算术或枚举类型的操作数的二元运算符会以类似的方式引起转换并产生结果类型。 目的是产生一个通用类型,它也是结果的类型。 这种模式称为通常的算术转换 ,定义如下:
- 如果任一操作数的类型为
long double
,则另一个操作数应转换为long double
。- 否则,如果任一操作数为
double
,则另一个操作数应转换为double
。- 否则,如果任一操作数是
float
,则另一个操作数应转换为float
。- 否则,应对两个操作数执行整体促销。
- ...
4.5 / 1积分促销
如果
int
可以表示源类型的所有值,则可以将char
,signed char
,unsigned char
,short int
或unsigned short int
类型的rvalue转换为int
类型的rvalue。 否则,源rvalue可以转换为unsigned int
类型的rvalue。
我认为它与int
被认为是执行环境的“自然”大小,以允许有效的算术(参见Charles Bailey的答案 )。
我原以为“a | b”的类型是unsigned char,因为两个操作数都是unsigned char,
我在过去阅读一些初学者C书籍后留下的印象是,按位运算符只是为了系统编程而保留在语言中,通常应该避免。
操作符由CPU本身执行。 CPU用于操作数寄存器(肯定比char大),因此编译器无法知道操作会影响寄存器的多少位。 为了不松开操作的全部结果,编译器将结果向上转换为正确的操作。 AFAICT。
为什么设计语言以使结果为int,或者此实现是否依赖?
数据类型的位级表示实际上是实现定义的。 这可能是明显按位操作也是实现定义的原因。
虽然C99在6.2.6.2 Integer types
定义了它们应该如何出现和表现(以及后来的按位操作应该如何工作),但特定章节为实现提供了很大的自由度。
看来这和Java一样:
Short和char(以及小于int的其他整数)是比int更弱的类型。 因此,对这些较弱类型的每个操作都会自动取消装入int。
如果你真的想得到一个简短的,你将不得不对它进行类型化。
不幸的是我无法告诉你为什么这样做了,但似乎这是一个相对常见的语言决定......
是不是short
一样short int
? 就像long
与int
同义词一样。 例如。 一个short
的一个int
占用更少的内存中,然后一个标准int
?
int
应该是任何给定机器体系结构的自然字大小,并且许多机器具有仅(或至少最佳地)对机器字执行算术运算的指令。
如果语言是在没有整数提升的情况下定义的,那么许多多步计算本来可以自然地直接映射到机器指令中,可能必须穿插在中间体上执行的掩蔽操作,以便生成“正确”的结果。
C和C ++都不会对小于int
类型执行任何算术运算。 每次指定较小的操作数(任何char
或short
风格)时,操作数都会被提升为int
或unsigned int
,具体取决于范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.