2017-10-29 58 views
3
int main() { 
    char * a = (char*)malloc(1); 
    *a = 0xff; 
    std::cout << (*a == 0xff); 
    return 0; 
} 

왜 1 대신 1이 인쇄됩니까?왜이 경우에 false가 인쇄됩니까?

+1

빌드 할 때 컴파일러에서 경고 *를받지 못합니까? 그런 다음 더 많은 경고를 표시하기 위해 플래그를 추가해야합니다. 문제는'char'가'signed' 또는'unsigned' 일 수 있고, 당신의 경우에는'signed' 가능성이 가장 높습니다. –

+0

경고 없음 (Codeblocks) –

+0

전역 컴파일러 설정으로 이동하여 경고 옵션 (gcc :'-Wall -Wpedantic -Wextra')을 추가하십시오 (컴파일러에 적합한 것을 검색하십시오) (그리고 어떤 코드를 사용하는지 알아보십시오. 컴파일러, IDE). 서명/부호없는 비교 (편집 : 또는 상수 오버플로 ... hehe .. argh)에 대해 반드시 경고해야합니다. gcc는 다음을 방출합니다 : * 경고 : 암시 적 상수 변환 [-Woverflow] "* 및 -Wextra : *"경고 : 데이터 유형 [-Wtype-limits]의 제한된 범위로 인해 비교가 항상 거짓 임 "* – Ped7g

답변

6

0xff은 정수이고 그 유형은 int입니다. 비교를 수행하려면 *aint으로 승격해야합니다.

플랫폼에 char이 (가) 서명 된 것으로 보입니다. 따라서 정수로 승격 할 때 부호 확장이있게 될 것입니다.

int으로 가정하면 0xffffffff0x000000ff을 비교합니다.

unsigned char으로 전환하면 원하는 결과를 얻을 수 있습니다.

+0

감사합니다. 좋은 설명을 해주셔서 대단히 감사합니다! –

+0

@JaroslavTavgen - 도와 드리겠습니다. Btw, 컴파일러 스위치를 확인해야합니다. [대부분 ** 당신에게 경고합니다 **] (http://coliru.stacked-crooked.com/a/259265e9c0bc7de2). – StoryTeller

+0

다시 한번 감사드립니다! 나는 컴파일러에서 경고를 켰고, 이제는 코드를 컴파일 할 때 경고가 2 개 표시된다. "경고 : 암시 적 상수 변환 [-Woverflow]"의 오버플로 "및"warning : 제한된 데이터 유형 범위 [ W 유형 제한] " –

0

16 진수의 0xff는 10 진수 255입니다. char 키워드는 부호가있는 문자를 나타내며 그 범위는 -128에서 127 (포함)입니다. 255는 char에 저장할 수 없으므로 오버 플로우됩니다. 결과 값이 무엇이든, 0xff가 아닙니다.

따라서 False를 인쇄합니다.

희망이 도움이되었습니다. :)

+0

'char'는 부호가 있거나 부호가 없을 수 있습니다 –