gpt4 book ai didi

c++ - 表达式类型

转载 作者:太空狗 更新时间:2023-10-29 19:59:03 26 4
gpt4 key购买 nike

考虑 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,通常的算术转换应该将这两个值提升为无符号整数:

 10 = b00000000000000000000000000001010
20 = b00000000000000000000000000010100

然后,它会进行 2 的补码以获得 -20 并将其相加:

 10 = b00000000000000000000000000001010
-20 = b11111111111111111111111111101100
b11111111111111111111111111110110

将其解释为一个无符号整数,您将得到 4294967286——很好。

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

据此,我推断,如果在通常的算术转换后对操作数进行签名,则结果也是有符号的。否则,结果是无符号的。

所以,我的问题是:

  1. 我的推论正确吗?
  2. 标准在哪里定义的?我在 C 或 C++ 标准中找不到对此的任何引用。
  3. 其他操作呢?我怀疑 +* 等将以相同的方式工作,但是移位和逻辑运算呢?

编辑: 这似乎与 C++11 type of (signed + unsigned)? 有关,但我的问题的关键部分似乎在接受的答案中缺失:在通常的算术转换之后,表达式的结果是否始终是两个操作数的类型?

最佳答案

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

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

在那之后,如果(可能转换的)操作数类型是:

  • 完全一样,没有发生转换。

  • 大小相同,无符号优先。

  • 不同大小,较小的转换为较大的。如果较大的是无符号的,较小的也会转换为无符号的。

这种转换将操作数变成相同的类型,这也是结果的类型。

它包含在 C++11 标准的 [expr]§9 中。它还与 [conv][conv.rank] 密切相关。 [expr] 的子章节中的各个运算符的描述中涵盖了这究竟适用于哪些运算符。

关于c++ - 表达式类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15662006/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com