【问题标题】:C/C++ Negating a integer type variable with a value of 0C/C++ 对值为 0 的整数类型变量求反
【发布时间】:2013-09-16 21:46:38
【问题描述】:

我想将某个值的符号更改版本传递给函数。如果标志发生变化,我知道如何检查溢出,但是我不知道这种情况。

int apple( int );

int a = 0;

apple( -a );

C/C++ 标准是否涵盖了该定义的行为?我正在传递 -0 我猜当 a == 0 时。用这样的东西代替:a ? -a : a 怎么样?谢谢

【问题讨论】:

  • 存在溢出情况,但不为零:a = -2147483648; apple(-a); 在 2 的补码 32 位机器上溢出。

标签: c++ math integer signed integer-overflow


【解决方案1】:

-a 对于a == 0 的情况定义明确。标准要求的是它仍然为零。

它不保证值中的“位”不变(它们用于二进制补码,但不用于二进制补码,在这种情况下,无论其位模式如何,值都是“负零”)。但是对于if (!x)if (x == 0),该值应该为真,即使x 的值是“负零” - 由编译器和/或处理器制造商来确保它有效。

【讨论】:

    【解决方案2】:

    对具有值0 的整数求反得到0。无需任何特殊处理。

    【讨论】:

      【解决方案3】:

      在数学中,在 C++ 中 -0 == 0

      即使允许实现使用ones' complement(因此可以有 0 和 -0 的位模式),但这不会改变值的 含义 和任何额外的计算处理特定的-0 案例所必需的只是一个实现细节,对程序员来说是完全透明的。

      【讨论】:

      • 有趣的事实:它写成 ones'complement - 注意撇号的位置 - 因为它是“1 的补码”,是所有位都设置的数字的补码,所以“ones”是复数形式。另一方面,二的补码是二的幂的补码,所以“二”是单数形式。
      猜你喜欢
      • 2021-03-19
      • 2015-05-26
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2019-06-20
      相关资源
      最近更新 更多