2013-04-17 4 views
3
#include <stdio.h> 
int main(void) 
{ 
    char test = 0x80; 
    printf("%c\n", test); /* To remove the "unused" warning */ 
    return 0; 
} 

나는 문자가 하나의 바이트임을 보장합니다. 0x80도 1 바이트입니다. 그럼 왜 다음과 같은 오류/경고 메시지가 나옵니까?왜이 프로그램의 오버플로가 발생합니까?

error: overflow in implicit constant conversion [-Werror=overflow]

내 경우에는 경고를 오류로 처리하기 때문에 오류가 발생합니다.

0x80은이 경고/오류가 나타나는 최소값입니다. 0x7F로 변경하면 정상적으로 컴파일됩니다. 나는 ideone.com을 'C99 strict'옵션과 함께 사용하여 코드를 컴파일했다. gcc-4.7.2를 사용하여보고되었습니다.

답변

14

char 형식은 컴파일러에서 서명되었으므로 8 비트의 정보가 있더라도 127 (0x7f)보다 큰 값을 저장할 수 없습니다.

<limits.h> 헤더는 char을 포함한 정수형의 부호와 범위 제한을 결정할 수있는 매크로를 정의합니다.

+1

오. 나는 그런 작은 세부 사항을 잊어 버린 것을 믿을 수 없다. 감사! –

2

변수 테스트는 기본적으로 signed char 인 char로 정의됩니다. 범위는 0 ~ 127 (7 비트)입니다. 마지막 비트는 서명 용으로 예약되어 있습니다. 어쩌면 음수 값 (0x80 = -128)이있는 문자를 인쇄하려고하면 오류가 발생할 수 있습니다.

테스트를 위해 서명되지 않은 char을 시도하고 동일한 오류가 발생하는지 확인하십시오.

+0

답변 해 주셔서 감사합니다. 그렇습니다. Jon이 지적한대로 이것이 실제로 이유였습니다. 'unsigned char'으로 변경하면 경고/오류가 제거되었습니다. –

관련 문제