表达式的类型

Type of an expression

本文关键字:类型 表达式      更新时间:2023-10-16

考虑c++程序的以下部分:打印到控制台的值作为注释给出。

{ // case 1
unsigned int x = 10; 
unsigned int y = 20; 
std::cout << "u/u x - y: " << x-y << std::endl; // 4294967286
}   
{ // case 2
int x = 10; 
int y = 20; 
std::cout << "s/s x - y: " << x-y << std::endl; // -10
}   
{ // case 3
unsigned int x = 10; 
int y = 20; 
std::cout << "u/s x - y: " << x-y << std::endl; // 4294967286
}   
{ // case 4
int x = 10; 
unsigned int y = 20; 
std::cout << "s/u x - y: " << x-y << std::endl; // 4294967286
}

我试图弄清楚c++(尝试与gcc 4.7.2)如何从表达式定义类型(更具体地说,它的签名)。对于情形1、3和4,通常的算术转换应该将两个值都提升为unsigned int:

 10 = b00000000000000000000000000001010
 20 = b00000000000000000000000000010100

然后,它会做一个2的补码来得到-20并加上它:

 10 = b00000000000000000000000000001010
-20 = b11111111111111111111111111101100
      b11111111111111111111111111110110

将其解释为unsigned整数,得到4294967286——非常好。

显然,对于情形2,您得到相同的计算/结果;然而,通常的算术转换应该导致两个操作数被解释为有符号整型,并且结果似乎被解释为有符号整数。

从这里,我推断,如果操作数在通常的算术转换之后是有符号的,那么结果是有符号的。否则,结果为unsigned

我的问题是:

  1. 我的演绎正确吗?
  2. 标准在哪里定义这个?我在C或c++标准中找不到任何参考。
  3. 其他操作呢?我怀疑+, *等将以同样的方式工作,但是移位和逻辑操作呢?

Edit:这似乎与c++ 11类型(有符号+无符号)有关?,但我的问题的关键部分似乎从公认的答案中缺失:表达式的结果是否总是在通常的算术转换之后的两个操作数的类型?

转换遵循整数转换秩原则。简而言之,整型操作数的处理方式如下:

首先,每个小于int的操作数都转换为int(如果原始类型的所有值都适合),否则转换为unsigned int

之后,如果操作数类型为:

  • 完全相同,不发生转换

  • 同样大小的
  • , unsigned优先。

  • 不同大小的
  • ,较小的转换为较大的。

此转换将操作数转换为相同的类型,该类型也是结果的类型。

它被c++ 11标准的[expr]§9所覆盖。它也与[conv][conv.rank]密切相关。具体适用于哪些操作符,将在[expr]的子章节中对各个操作符进行描述。

好吧,这很简单,我只是误解了标准…源自c++ 11,§5 [expr] p9:

期望操作数为算术或的许多二元操作符枚举类型导致转换并产生类似的结果类型道路目的是产生一个公共类型,它也是的类型结果。此模式称为常规算术转换,…

相关文章: