2016-09-01 4 views
1

Действительно простой вопрос здесь. У меня действительно простая программа для добавления двух чисел и распечатка суммы этих чисел (см. Ниже). При запуске программы он работает как ожидалось и распечатывает 40 000 для 20 000 + 20 000. Но когда я меняю int a, b и суммирую до short a, b и sum, я получаю -25 536 в качестве ответа. Любой, кто может объяснить, почему это происходит? У меня есть идея, но мне хотелось бы услышать ее от того, кто ее знает. Спасибо за прочтение.При добавлении двух коротких номеров

int a, b, sum; 

a = 20000; b = 20000; sum = a+b; 
printf("%d + %d = %d\n", a, b, sum); 
+1

Максимальное значение 'short' для вашей реализации -' 32767'. – Barmar

+0

вы можете попробовать 'unsigned short', если хотите 65535 max? – corn3lius

ответ

5

На вашей системе, short предположительно 16 бит, поэтому диапазон значений -32768 к 32767. 20000 + 20000 больше, чем максимальное значение, поэтому это приводит к переполнению, что приводит к неопределенному поведению.

Если вы измените на unsigned short, диапазон будет 0 до 65525, и добавление будет работать. Кроме того, переполнение хорошо определено с целыми числами unsigned, оно просто обертывается с использованием модульной арифметики, например. (unsigned short)65535 + 2 = 1.

1

Максимальное значение подписанную короткое является 32767

В двоичной, это 16-битное число, а не 32 битное число (как в случае с Интс). Потому что он подписал, она представлена ​​следующим образом:

0 11111 11111 11111 

При добавлении 1 к этому, он становится

1 00000 00000 00000 

Который вернулся, чтобы -32768

Вы, вероятно, получите идею.

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