Гарантирует ли стандарт C ++ 11, что унарный минус нулевого знакового целого числа равен нулю? - PullRequest
5 голосов
/ 15 января 2020

Гарантирует ли стандарт C ++ 11, что унарный минус нулевого значения целое число со знаком равно нулю?

Например:

int zero = 0;
int n = -zero;
int m = -0;
assert(memcmp(&n, &zero, sizeof(int)) == 0);
assert(memcmp(&m, &zero, sizeof(int)) == 0);

I знаю, что -0 и 0 идентичны в представлении комплимента двух, но я хотел бы знать, допускает ли стандарт, чтобы отрицание целого нуля со знаком было отрицательным-ноль для других представлений, таких как комплимент или подпись

Все, что я мог найти в черновике C ++ 11, это §5.3.1, параграф 8:

Операнд унарного оператора должен иметь арифметику c или тип перечисления с незаданной областью и результатом является отрицание его операнда . Интегральное продвижение выполняется для целочисленных или перечислимых операндов. Отрицание числа без знака вычисляется путем вычитания его значения из 2 ^ n, где n - количество битов в повышенном операнде. Тип результата - это тип повышенного операнда.

Я не могу найти определение отрицание в черновике.

Мотивация : я пишу специализированный синтаксический анализатор целых чисел для библиотеки (которая может быть в конечном итоге с открытым исходным кодом), и я хочу знать, следует ли мне беспокоиться о возможности интерпретации "-0" как отрицательного нуля целое число со знаком на необычных архитектурах.

Примечание : я уже знаю о числах с плавающей точкой с отрицательным нулем.

1 Ответ

0 голосов
/ 15 января 2020

Стандарт не предписывает битовые комбинации для целых чисел, поскольку он предназначен для применения к самому широкому кругу машин. Для компилятора C ++ вполне возможно использовать комплимент, где ноль и отрицательный ноль будут разными.

...