为什么在这种情况下打印错误?
int main() {
char * a = (char*)malloc(1);
*a = 0xff;
std::cout << (*a == 0xff);
return 0;
}
为什么打印0而不是1?为什么在这种情况下打印错误?
0xff
是一个积分常数,其类型为int
。要进行比较,*a
必须升级到int
。
看起来char
已在您的平台上签名。所以当推广到一个整数时,将会有符号扩展。
假设32位int
,您在比较0xffffffff
与0x000000ff
。
切换到unsigned char
会给你想要的结果可靠。
你非常好的解释! –
@JaroslavTavgen - 乐于助人。顺便说一句,你应该检查你的编译器开关。 [大多数**会警告你**](http://coliru.stacked-crooked.com/a/259265e9c0bc7de2)。 – StoryTeller
再次谢谢你!我在编译器中打开了警告,现在编译代码时显示2个警告:“warning:溢出隐式常量转换[-Woverflow]”和“警告:由于数据类型范围有限,比较始终为false [ - Wtype-limits]“ –
十六进制中的0xff是十进制的255。 char关键字表示有符号字符,范围从-128到127(含) 255不能存储在字符中并溢出。无论结果如何,它都不是0xff。
因此,它打印False。
希望有帮助! :)
'char'可以是有符号的或无符号的 –
当你建立,你没有从编译器* *警告*?那么也许你应该添加标志来显示更多的警告。问题很可能与'char'有关,可以是'signed'或'unsigned',在你的情况下最有可能是'signed'。 –
没有警告(Codeblocks) –
转到全局编译器设置并添加警告选项(gcc:'-Wall -Wpedantic -Wextra')(搜索什么适合您的编译器)(并找出您使用哪个,codeblocks不是编译器,但IDE)。它当然应该警告你有关已签名/未签名的比较(编辑:或常量溢出... hehe .. argh)。 gcc将发出:*“警告:隐式常量转换中的溢出[-Woverflow]”*和-Wextra:*“警告:由于数据类型范围有限,比较总是为false [-Wtype-limits]”* – Ped7g