2016-09-01 3 views
1

정말 간단한 질문은 여기에 있습니다. 두 개의 숫자를 더하고 그 숫자의 합계를 인쇄하는 정말 간단한 프로그램이 있습니다 (아래). 프로그램을 실행할 때 예상대로 작동하고 20 000 + 20 000에 대해 40 000을 인쇄합니다. 그러나 int a, b 및 sum을 으로 변경하면 a, b 및 sum으로 -256을 얻을 수 있습니다. 이것이 일어나는 이유를 설명 할 수있는 사람은 누구입니까? 나는 생각을 가지고 있지만 그것을 아는 사람으로부터 듣고 싶습니다. 읽어 주셔서 감사합니다. 시스템에두 개의 짧은 숫자를 추가 할 때

int a, b, sum; 

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

구현시 'short'의 최대 값은 '32767'입니다. – Barmar

+0

65535 max를 원하면'unsigned short'를 시도해 볼 수 있습니까? – corn3lius

답변

5

short 아마도 16 비트이기 때문에, 값의 범위는 32767--32768이다. 20000 + 20000이 최대 값보다 크므로 오버플로가 발생하여 정의되지 않은 동작이 발생합니다.

unsigned short으로 변경하면 범위는 0에서 65525으로 변경되고 추가가 적용됩니다. 또한 오버플로는 unsigned 정수로 잘 정의되어 있으며 모듈러 산술을 사용하여 간단하게 둘러 쌉니다. (unsigned short)65535 + 2 = 1. (int 치의 경우와 같이)

1

서명 단편의 최대 값이 이진수 32767

이며, 이는 16 비트의 수보다는 32 비트 수이다. 가 서명 있기 때문에, 다음과 같이이 표시됩니다 :

0 11111 11111 11111 

당신이 1을 추가 할 경우, 당신은 아마 생각을 다시 -32768

하는 것입니다

1 00000 00000 00000 

된다.

관련 문제