【问题标题】:why do unary operators return different type than their operands?为什么一元运算符返回与其操作数不同的类型?
【发布时间】:2020-03-08 12:27:40
【问题描述】:

看起来好像 uint16_t 和 uint8_t 上的一元按位非运算符 (~) 返回 int, 而不是其操作数的类型(一元 - 相同)。 有人可以说明为什么会这样吗?

令人惊讶的是 ~uint16_t(0)

我使用 g++ 版本 9.2.1 20191008 (Ubuntu 9.2.1-9ubuntu2) x86_64-linux-gnu

【问题讨论】:

  • 因为“通常的提升”总是在所有操作数上执行。 ~ 运算符仅适用于 int、long、long long、unsigned、unsigned long 和 unsigned long long 类型的操作数。其他一切都需要转换。

标签: c++ return-type unsigned unary-operator


【解决方案1】:

来自 C++11 Standard 5.3.1.8:

一元 - 运算符的操作数应具有算术或无范围枚举类型,结果是其操作数的否定。对整数或枚举操作数执行整数提升。无符号量的负数是通过从 2^n 中减去其值来计算的,其中 n 是提升的操作数中的位数。结果的类型是提升操作数的类型。

所以它声明整数提升发生在一元运算符上。

【讨论】:

  • 有什么想法他们为什么想出这个?
  • (我个人的想法。不要假装是真的。)现代硬件使用通常是固定宽度的寄存器进行操作,例如64 位。为了保持语言效率,将所有内容推广到注册宽度是有意义的。想象一下,如果您只需要处理寄存器的一部分,硬件会有多复杂。
  • 这是有道理的。而且我猜寄存器更喜欢有符号的值。
猜你喜欢
  • 2016-02-01
  • 2012-09-25
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多