2009-08-14 2 views
2

나는 이것에 대해 궁금 해요 : 내가 int 변수에 정수 값을 할당 할 때 (16 비트 컴파일러는 정수의 2 바이트)의 말을하자유형 선택

int a; 

a=40000; 

은 유형 범위로 표시 할 수 없으므로 잘립니다. 하지만 내가 보는 결과는 의 결과 값이의 비트 패턴이 -25000 (또는 일부 가까운 수)의 비트 패턴이므로 컴파일러에서 십진수 40000으로 선택하는 이진 표현이 부호없는 정수 표현임을 의미합니다. 그리고 그게 내 질문을 제기 : 어떻게 컴파일러는이 리터럴 표현식의 유형을 선택합니까?

필자는 필요한 저장 공간을 줄여 값을 처리 할 수있는 유형을 사용하고 있다고 생각합니다.

+1

좋은 컴파일러는 이러한 경우에 경고를 방출한다. – 0x6adb015

답변

2

여기에서의 동작은 C89와 C99에서 다릅니다. C89에서

은 십진 정수 리터럴이 표현 될 수있는 이러한 종류의 제 취 C99에서

int, long, unsigned long 

십진 정수 리터럴은 표현할 수있는 이러한 유형의 제 얻어 : 특정 코드에 대한

int, long, long long 

40000이 긴에 맞게 보장되어 있기 때문에 그것이 차이가 없습니다 니펫을하지만, C89 및 C99 리터럴 사이의 몇 가지 중요한 차이점이 있습니다.

그 결과의 일부를

는 여기에 설명되어 있습니다

http://www.hardtoc.com/archives/119

0

16 진법의 40000은 0x9C40입니다. 이 값의 최상위 비트는 1 (0x8000)입니다. two's complement 표현을 가정하면 0x9C40을 부호있는 표현으로 벼우면 나머지 비트에서 부호 비트의 값을 빼서 0x1C40 - 0x8000 = -0x63C0 = -25536 (기본 10)이됩니다.

자세한 내용은 CERT C 보안 코딩 표준 Wiki에서 INT00-C. Understand the data model used by your implementation(s)INT02-C. Understand integer conversion rules을 확인하십시오. Kernighan & Ritchie 가입일

+0

사실이며 관련성이 있습니다.하지만 실제 질문은 "컴파일러가"해당 유형의 int에 할당 할 때 어떻게되는지 "가 아닌"리터럴 형식을 선택하는 방법 "이라고 생각합니다. –

2

부록 A2.5.1 (정수 상수), P (193) :

그 형태 값 접미어에 따라 ... 정수 상수의 형태는 unsuffixed 및 이면 십진수 일 경우, 유형 중 첫 번째 값은 일 수 있습니다. int, long int, 부호 없음 long int.

"C 프로그래밍 언어"의 두 번째 버전이 C99 표준보다 앞서 있기 때문에이 대답은 C89와 관련이 있습니다.

관련 문제