我知道整数值0
和-0
本质上是相同的。但是,我想知道是否有可能区分它们。
例如,如何知道变量是否被赋值为-0
?
bool IsNegative(int num)
{
// How ?
}
int num = -0;
int additinon = 5;
num += (IsNegative(num)) ? -addition : addition;
存储在内存中的值-0
和0
是否完全相同?
我知道整数值0
和-0
本质上是相同的。但是,我想知道是否有可能区分它们。
例如,如何知道变量是否被赋值为-0
?
bool IsNegative(int num)
{
// How ?
}
int num = -0;
int additinon = 5;
num += (IsNegative(num)) ? -addition : addition;
存储在内存中的值-0
和0
是否完全相同?
0
和 -0
是不同的? 我真的希望它的行为更像是允许两个相同值的位表示,而你的程序可以使用任何一个。 - user1084944-0
(即将整数常量0
应用一元运算符-
得到的结果)进行赋值或初始化会得到一个负零表示。不管具体表示方式如何,标准从未说过0
和-0
在数学上是不同的值,只是可能存在一种负零位模式。如果存在这种模式,则仍然表示相同的数值0。 - Steve Jessop对于一个使用几乎普遍的“二进制补码”表示法的整数int
,0
和-0
的表示方式是相同的。(在其他数字表示法中,例如IEEE 754浮点数,它们可能不同。)
让我们从用二进制补码表示0开始(当然还有许多其他的系统和表示方法,这里我只是参考了这个特定的方法),假设使用8位,那么0为:
0000 0000
现在让我们翻转所有位并加1以得到2的补码:
1111 1111 (flip)
0000 0001 (add one)
---------
0000 0000
我们得到了0000 0000
,这也是-0的表示方式。
但请注意,在1's complement中,有符号的0是0000 0000,而-0是1111 1111。
因此,我们可以得出结论:没有可靠的方法来检测这种情况。即使不考虑非二进制补码表示在现代计算机系统中非常罕见的事实。未指定这些情况是否实际上会生成负零或一般零,以及负零在存储在对象中时是否变为一般零。
_Bool
、_Complex
、指定初始化程序或复合字面量)。当需要时,C++标准知道如何并入C标准,例如[basic.fundamental]/p3:“带符号和无符号整数类型应满足C标准第5.2.4.2.1节中给出的约束条件。” - T.C.-0
和+0
有不同的表示方式,那么memcmp
函数将能够区分它们。#include <string>
int main() {
int a = ...
int b = ...
if (memcmp(&a, &b, sizeof(int))) {
// a and b have different representations in memory
}
}
当然,如果确实发生了这种情况,除了直接内存操作之外,这两个值仍然会以完全相同的方式工作。
int
的实现(目前最常见的情况),数字0
和-0
在位表示上是完全相同的。 - Mankarseint
。请参阅补码编码。 - CiaPan