Как отрицательный ноль используется в этом контексте? - PullRequest
0 голосов
/ 07 октября 2010
struct in_addr ipv4;

ipv4.s_addr = (uint32_t)(-0)

Ответы [ 3 ]

6 голосов
/ 07 октября 2010

Это странно, обычно арифметика реализуется с помощью дополнения до двух , поэтому у вас фактически нет отрицательного представления 0.

В версии One Complement отрицательный 0 вместо этого сохраняется как 0xFFFFFFFF, поэтому при преобразовании в адрес ipv4 после преобразования в unsigned int вы получите 255.255.255.255.

В то время как в обычной архитектуре использование -0 для приведения его к целому без знака должно просто дать вам 0x00000000.

1 голос
/ 07 октября 2010

Это не имеет особого смысла, так как стандарт говорит о точных типах целочисленной ширины

Эти типы являются необязательными. Однако если реализация обеспечивает целое число типы с шириной 8, 16, 32 или 64 биты, без дополнительных битов, и (для подписанные типы), которые имеют два дополняет представление, оно должно определить соответствующий typedef имена.

Итак, во-первых, для любого из этих типов со знаком нет отрицательного нуля, а для неподписанных типов еще меньше. В любом случае для задания, которое вы показываете, простое значение 0 будет таким же хорошим, или UINT32_C(0), если вы хотите быть разборчивым.

0 голосов
/ 07 октября 2010

Используется для получения значения со знаком целого без знака или на единицу больше максимального значения целого числа со знаком.

uint32_t будет приводить его к целому числу без знака, тогда как -0 будет принудительно устанавливать его в отрицательное значение, переворачивая бит со знаком и возвращая значение без знака при перевернутом.

Эта статья объясняет целые числа со знаком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...