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

为什么打印0而不是1?为什么在这种情况下打印错误?

+1

当你建立,你没有从编译器* *警告*?那么也许你应该添加标志来显示更多的警告。问题很可能与'char'有关,可以是'signed'或'unsigned',在你的情况下最有可能是'signed'。 –

+0

没有警告(Codeblocks) –

+0

转到全局编译器设置并添加警告选项(gcc:'-Wall -Wpedantic -Wextra')(搜索什么适合您的编译器)(并找出您使用哪个,codeblocks不是编译器,但IDE)。它当然应该警告你有关已签名/未签名的比较(编辑:或常量溢出... hehe .. argh)。 gcc将发出:*“警告:隐式常量转换中的溢出[-Woverflow]”*和-Wextra:*“警告:由于数据类型范围有限,比较总是为false [-Wtype-limits]”* – Ped7g

回答

6

0xff是一个积分常数,其类型为int。要进行比较,*a必须升级到int

看起来char已在您的平台上签名。所以当推广到一个整数时,将会有符号扩展。

假设32位int,您在比较0xffffffff0x000000ff

切换到unsigned char会给你想要的结果可靠。

+0

你非常好的解释! –

+0

@JaroslavTavgen - 乐于助人。顺便说一句,你应该检查你的编译器开关。 [大多数**会警告你**](http://coliru.stacked-crooked.com/a/259265e9c0bc7de2)。 – StoryTeller

+0

再次谢谢你!我在编译器中打开了警告,现在编译代码时显示2个警告:“warning:溢出隐式常量转换[-Woverflow]”和“警告:由于数据类型范围有限,比较始终为false [ - Wtype-limits]“ –

0

十六进制中的0xff是十进制的255。 char关键字表示有符号字符,范围从-128到127(含) 255不能存储在字符中并溢出。无论结果如何,它都不是0xff。

因此,它打印False。

希望有帮助! :)

+0

'char'可以是有符号的或无符号的 –

相关问题