gpt4 book ai didi

c - 宏打印不正确的输出

转载 作者:太空宇宙 更新时间:2023-11-04 06:53:52 24 4
gpt4 key购买 nike

我正在学习 C 编程,这是我的问题。我觉得我已经学习了 C 中的宏主题,但我想我还没有完全准备好。

#define PGSIZE    4096 
#define CONVERT(sz) (((sz)+PGSIZE-1) & ~(PGSIZE-1))

printf("0x%x", CONVERT(0x123456));

问题来了。我的预期输出是 0x100000000000 但它打印出 0x124000

((sz)+PGSIZE-1) = (0x123456)+4096-1 
= (0x123456)+(0x1000 0000 0000) - 1 //4096 is 2^12
= 0x1000 0012 3456 - 1
= 0x1000 0012 3455

~(PGSIZE-1) => ~(0x0111 1111 1111) = 0x1000 0000 0000

((sz)+PGSIZE-1) & ~(PGSIZE-1) = (0x1000 0012 3455) & (0x1000 0000 0000)
= 0x100000000000

但是当我运行程序时,它打印出 0x124000。

我做错了什么?

最佳答案

你在问题​​中展示了:

((sz)+PGSIZE-1) => (0x123456)+4096-1 
=(0x123456)+(0x1000 0000 0000) - 1 //4096 is 2^12
=0x1000 0012 3456 - 1

您将 4096 转换为二进制表示法,但随后将其视为十六进制数。那行不通的。如果要保留十六进制表示法,那就是:

((sz)+PGSIZE-1) => (0x123456)+4096-1 
=(0x123456)+(0x1000) - 1
=0x124456 - 1

或者将两者都转换为二进制,即:

((sz)+PGSIZE-1) => (0x123456)+4096-1 
=(0b1_0010_0011_0100_0101_0110)+(0b1_0000_0000_0000) - 1
= 0b1_0010_0100_0100_0101_0110 - 1

关于c - 宏打印不正确的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47545948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com