2010-04-27 5 views
6

나는 다음 코드를 가지고 있으며, 항상 if 문장의 진실한 부분을 입력해야하지만, 120을 넘어 서면 else 절을 실행하는 것처럼 보입니다. 왜 그런 일이 일어나는거야?이 프로그램의 출력이 130시에 변경되는 이유는 무엇입니까?

char x; 
for (i=0;i<256;i+=10) { 
    x=i; 
    if (x==i) 
     printf("%d true\n",i); 
    else 
     printf("%d false\n",i); 
} 

출력은 다음과 같습니다 당신이 문자 키워드를 사용할 때

0 true 
10 true 
: all numbers from 20 to 100 are true 
110 true 
120 true 
130 false 
140 false 
: all numbers from 150 to 230 are false 
240 false 
250 false 
+0

무엇!? 내가 읽지 못해서 네가 무엇을 요구하는지 모르겠다. – wheaties

+3

마크와 나는 모두 어떤 질문을 받았는지 쉽게 확인할 수있었습니다. 질문은 단지 잘못 말한 것입니다. 귀하가 종결 사유로 주장하는 것은 아닙니다. –

+2

문구가 아주 쉽게 개선 될 수 있다고 생각하지만 문을 닫은 상태에서 편집 할 수 없기 때문에 다시 투표 할 수 있습니다. –

답변

12

귀하의 컴파일러는 아마 기본적으로 서명 된 문자를 사용합니다. 부호 첨부 char의 범위는 통상 -128에서 127까지입니다 만, int의 범위는 훨씬 넓습니다. 일반적인 데스크탑 PC를 능가하는 더 복잡한 하드웨어는 다른 값을 사용할 수 있습니다.

+0

이 특정 케이스에 대해서는 거의 확실하게 맞았습니다. 그러나 나는이 특별한 경우에 _is_임을 분명히하고 싶습니다. C 표준의 어떤 것도 8 비트 char을 요구하지 않으며 정수가 char보다 더 큽니다. 덧붙여서, 당신은 "_signed_ char의 범위는 -128에서 ..."라고 생각했습니다. – paxdiablo

+2

실제로, 모호성을 피하기 위해 C99은 char이 적어도 * 8 비트 (5.2.4.2.1) 여야한다는 것을 명령하며, int는 -32767에서 +32767까지의 모든 값을 포함 할 수 있습니다. "int의 범위가 -128..127보다 훨씬 큽니다"라는 문구는 기술적으로 사실입니다. –

+0

@ paxdiablo 감사합니다. 실제로 말하고자했던 것을 편집했습니다. 그렇습니다. 8 비트 문자를 사용하는 것은 꽤 쉽습니다. 나는 그랬지만 항상 그렇지 않을 수도 있다는 것을 아주 잘 알고있었습니다. 나는이 복잡한 문제가 op의 기술 단계의이 단계에서 불필요하다고 결정했다. - 나는 빠른 ++ 수정을 원했다 .-) –

13

부호가있는 char 및 아마도 정수를 사용하기 때문입니다.

char이 130에 도달하면 오버플로 (130 - 256이되지만)하지만 정수는 오버플로하지 않습니다. 130-256 = 130

결과는 항상 true가되도록 간단한 변화가 그것을 수정 - 단지 첫 번째 줄에 unsigned을 추가!

unsigned char x; 
for (int i=0;i<256;i+=10) 
{ 
    x=i; 
    if (x==i) 
     printf("%d true\n",i); 
    else 
     printf("%d false\n",i); 
} 
+3

그리고 예제 코드가 크기가 10 단계가 아니라면 127/128 경계에서 일어 났을 것이기 때문에 무슨 일이 일어나고 있는지 훨씬 더 분명했을 것입니다. – nategoose

관련 문제