表达式的类型
Type of an expression
考虑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我的问题是:
- 我的演绎正确吗?
- 标准在哪里定义这个?我在C或c++标准中找不到任何参考。
- 其他操作呢?我怀疑
+
,*
等将以同样的方式工作,但是移位和逻辑操作呢?
Edit:这似乎与c++ 11类型(有符号+无符号)有关?,但我的问题的关键部分似乎从公认的答案中缺失:表达式的结果是否总是在通常的算术转换之后的两个操作数的类型?
转换遵循整数转换秩原则。简而言之,整型操作数的处理方式如下:
首先,每个小于int
的操作数都转换为int
(如果原始类型的所有值都适合),否则转换为unsigned int
。
之后,如果操作数类型为:
-
完全相同,不发生转换
同样大小的 , unsigned优先。
不同大小的,较小的转换为较大的。
此转换将操作数转换为相同的类型,该类型也是结果的类型。
它被c++ 11标准的[expr]§9
所覆盖。它也与[conv]
和[conv.rank]
密切相关。具体适用于哪些操作符,将在[expr]
的子章节中对各个操作符进行描述。
好吧,这很简单,我只是误解了标准…源自c++ 11,§5 [expr] p9:
期望操作数为算术或的许多二元操作符枚举类型导致转换并产生类似的结果类型道路目的是产生一个公共类型,它也是的类型结果。此模式称为常规算术转换,…
相关文章:
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 表观调用前面的表达式必须具有指向 func 类型的指针
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 正则表达式以匹配数字的重复模式,后跟任何类型的分隔符?
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- 表达式必须具有类类型 vs.
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 非类类型表达式的静态类型与动态类型之间的差异
- 如何确定涉及 C++ 中除法的算术表达式的数据类型
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 下标需要数组或指针类型表达式必须具有指针对象类型
- 带有数组类型表达式的错误分配
- 表示函数参数的元组的类型表达式
- 如何确定撤销类型表达式的更大类型
- c++ 11中有新的函数类型表达式格式吗?