测试几个编译器(Comeau, g++)可以确认,“整数类型”的按位运算结果是一个int型:
void foo( unsigned char );
void foo( unsigned short );
unsigned char a, b;
foo (a | b);
我本来认为 "a | b" 的类型应该是无符号字符,因为两个操作数都是无符号字符,但编译器却说结果是整型,并且对 foo() 的调用不明确。为什么语言的设计是让结果成为整型,还是这取决于实现?
谢谢。
测试几个编译器(Comeau, g++)可以确认,“整数类型”的按位运算结果是一个int型:
void foo( unsigned char );
void foo( unsigned short );
unsigned char a, b;
foo (a | b);
我本来认为 "a | b" 的类型应该是无符号字符,因为两个操作数都是无符号字符,但编译器却说结果是整型,并且对 foo() 的调用不明确。为什么语言的设计是让结果成为整型,还是这取决于实现?
谢谢。
实际上这是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的答案)。
看起来这与Java中的情况相同:
Short和char(以及其他比int小的整数)是比int更弱的类型。因此,对这些较弱类型的每个操作都会自动解包为int。
如果您真的想获得一个short,那么您将不得不进行类型转换。
不幸的是,我无法告诉您为什么要这样做,但似乎这是一个相对常见的语言决策...
short
转换为 int
并不是 '拆箱'。拆箱是指像 Integer
到 int
这样的操作(相反的过程是 '装箱')。short
转换为 int
只是一个隐式转换(与显式转换相对应:int a = 123; short b = (short)a;
)。 - Brian S short
不就是和 short int
一样吗?就像 long
和 int
是同义词一样。例如,一个 short
是一个比标准的 int
占用更少内存的 int
吗?
long
不等同于 int
。这些类型之间的关系是 char <= short <= int <= long
,并且还有额外的规则规定每种类型的最小大小。 - James McNellisint
应该是任何给定机器架构的自然字长,许多机器都有仅(或至少最优地)在机器字上执行算术运算的指令。
如果语言没有定义整数提升,许多多步计算本来可以直接映射到机器指令中,但现在必须插入掩码操作以生成“正确”的结果。
int
和long
有时会溢出,但我的实际经验是,如果你进行了除增量之外的大量算术运算,short
几乎总是会溢出,因为我很少遇到数字保持那么小的实际问题。那些在16位微处理器上进行过大量编程的人可能会持不同意见:他们可能正在使用更小的数字来解决更小的问题;至于截断“令人惊讶”,我指的是从扫描代码的人的角度来看是令人惊讶的,而不是从没有概念计算机可能具有有限能力的人的角度来看是令人惊讶的。 - Steve Jessop无论是 C 还是 C++,它们都不会对比 int
更小的类型进行任何算术运算。每当您指定一个更小的操作数(任何类型的 char
或 short
),该操作数都会被提升为 int
或 unsigned int
,具体取决于范围。
int
或unsigned int
。这是此处唯一存在的“可以是”。至于提升本身,它总是无条件地要求的。 - AnT stands with Russiaint
/unsigned int
更小的类型执行算术运算。 - AnT stands with Russia