2016-07-07 2 views
0

У меня есть вопрос о числах с цифрами и шестнадцатеричных числах и их использовании в арифметике в C. Из того, что я понимаю, подписанные числа обычно могут хранить меньшие числа, чем их неподписанные копии.Должен ли я использовать формат шестнадцатеричного числа в C для выполнения арифметики?

Например, целое число со знаком, длина которого составляет 32 бита, имеет максимальное значение 2,147,483,647; тогда как 32-битное целое число без знака имеет диапазон до 4 294 967 295.

Оказывается, что значение этих чисел перетоков при выполнении сложения на максимально возможных значений:

printf("My integer: %i\n", 2147483647 + 1); 

Вывод, который я получаю:

My integer: -2147483648

Однако, несмотря на это переполнение , представление шестнадцатеричной числовой строки выглядит корректно и корректно для операции добавления.

printf("My hexadecimal: %#X\n", 0x7FFFFFFF + 0x1); // 2147483647 + 1 in Hex 

Вывод, который я получаю:

My hexadecimal: 0X80000000

Мой вопрос, будет ли какой-либо ситуации, когда выполнение этого типа сложения, а затем, глядя на шестнадцатеричное представление выгодно?

На первый взгляд кажется, что этот метод даст нам доступ ко всему диапазону 32-разрядного номера для операции добавления. Любые мысли или комментарии оценены. Cheers

+1

Игра с переполнениями - опасная игра. Шестнадцатеричное представление - это * только представление *. Он не содержит больше или меньше информации, чем десятичная. Это просто удобство использования того или другого. –

+1

Если вы хотите беззнаковые числа, используйте специальный 'u' суффикс:' 2147483647u' – anatolyg

+0

И% x (% X) - это значение без знака int hex. –

ответ

2

Переполнение целых чисел со знаком undefined behavior. Это означает, что вы не можете надежно предсказать, что произойдет, когда вы это сделаете.

Это означает, что вы видите здесь, что ваша система использует дополнение 2 для представления отрицательных значений в целых числах со знаком.

Хотя дополнение 2 очень распространено, оно не является универсальным. В некоторых системах вместо этого можно использовать знаковый бит. Поэтому для максимальной переносимости вы не должны зависеть от этого поведения.

+1

Поднятое целочисленное переполнение - UB. Строго говоря, пример ничего не доказывает. – Olaf

Смежные вопросы