Минус нуль (-0) эквивалентен нулю (0) в С#?
Минус нуль (-0) эквивалентен нулю (0) в С#
Ответ 1
Для целых чисел нет двоичного представления, которое делает разницу между 0 и -0, поэтому они по определению равны.
Для чисел с плавающей запятой IEEE существует различие отрицательного и положительного нуля. Я провел несколько тестов (CLR.NET Framework 2.0, С# 3), и кажется, что они считаются равными, что на самом деле является ожидаемым по стандарту IEEE 754.
Вот мой тестовый код, чтобы показать, что:
double minusOne = -1.0;
double positiveZero = 0.0;
double negativeZero = minusOne*positiveZero;
Console.WriteLine("{0} == {1} -> {2}", positiveZero, negativeZero, positiveZero == negativeZero);
Console.WriteLine("Binary representation is equal: {0}", BitConverter.DoubleToInt64Bits(positiveZero) == BitConverter.DoubleToInt64Bits(negativeZero));
Возврат:
0 == 0 -> True
Binary representation is equal: False
Ответ 2
Для десятичных чисел существует не менее 4 типов нулей:
Decimal zero = Decimal.Zero;
Decimal negativeZero1 = new Decimal(0, 0, 0, true, 0);
Decimal negativeZero2 = -0.0m;
Decimal negativeZero3 = Decimal.Negate(Decimal.Zero);
Пока все равны и распечатываются как "0"
, они имеют различное представление битов:
zero: {0x00000000 00000000 00000000 00000000 }
negativeZero1: {0x00000000 00000000 00000000 80000000 }
negativeZero2: {0x00000000 00000000 00000000 80010000 }
negativeZero3: {0x00000000 00000000 00000000 80000000 }
Ответ 3
if (-0 == 0) Console.WriteLine("YES, it is!");