int main() {
char * a = (char*)malloc(1);
*a = 0xff;
std::cout << (*a == 0xff);
return 0;
}
왜 1 대신 1이 인쇄됩니까?왜이 경우에 false가 인쇄됩니까?
int main() {
char * a = (char*)malloc(1);
*a = 0xff;
std::cout << (*a == 0xff);
return 0;
}
왜 1 대신 1이 인쇄됩니까?왜이 경우에 false가 인쇄됩니까?
0xff
은 정수이고 그 유형은 int
입니다. 비교를 수행하려면 *a
을 int
으로 승격해야합니다.
플랫폼에 char
이 (가) 서명 된 것으로 보입니다. 따라서 정수로 승격 할 때 부호 확장이있게 될 것입니다.
int
으로 가정하면 0xffffffff
과 0x000000ff
을 비교합니다.
unsigned char
으로 전환하면 원하는 결과를 얻을 수 있습니다.
감사합니다. 좋은 설명을 해주셔서 대단히 감사합니다! –
@JaroslavTavgen - 도와 드리겠습니다. Btw, 컴파일러 스위치를 확인해야합니다. [대부분 ** 당신에게 경고합니다 **] (http://coliru.stacked-crooked.com/a/259265e9c0bc7de2). – StoryTeller
다시 한번 감사드립니다! 나는 컴파일러에서 경고를 켰고, 이제는 코드를 컴파일 할 때 경고가 2 개 표시된다. "경고 : 암시 적 상수 변환 [-Woverflow]"의 오버플로 "및"warning : 제한된 데이터 유형 범위 [ W 유형 제한] " –
16 진수의 0xff는 10 진수 255입니다. char 키워드는 부호가있는 문자를 나타내며 그 범위는 -128에서 127 (포함)입니다. 255는 char에 저장할 수 없으므로 오버 플로우됩니다. 결과 값이 무엇이든, 0xff가 아닙니다.
따라서 False를 인쇄합니다.
희망이 도움이되었습니다. :)
'char'는 부호가 있거나 부호가 없을 수 있습니다 –
빌드 할 때 컴파일러에서 경고 *를받지 못합니까? 그런 다음 더 많은 경고를 표시하기 위해 플래그를 추가해야합니다. 문제는'char'가'signed' 또는'unsigned' 일 수 있고, 당신의 경우에는'signed' 가능성이 가장 높습니다. –
경고 없음 (Codeblocks) –
전역 컴파일러 설정으로 이동하여 경고 옵션 (gcc :'-Wall -Wpedantic -Wextra')을 추가하십시오 (컴파일러에 적합한 것을 검색하십시오) (그리고 어떤 코드를 사용하는지 알아보십시오. 컴파일러, IDE). 서명/부호없는 비교 (편집 : 또는 상수 오버플로 ... hehe .. argh)에 대해 반드시 경고해야합니다. gcc는 다음을 방출합니다 : * 경고 : 암시 적 상수 변환 [-Woverflow] "* 및 -Wextra : *"경고 : 데이터 유형 [-Wtype-limits]의 제한된 범위로 인해 비교가 항상 거짓 임 "* – Ped7g