gpt4 book ai didi

c++ - MSVC++ 处理 unsigned long long int

转载 作者:太空狗 更新时间:2023-10-29 20:47:31 27 4
gpt4 key购买 nike

我对 MSVC 处理无符号长整数的方式有疑问。这是要重现的代码:

// test.cpp (note extension)
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
unsigned long long int address = 0x0A0B0C0D0E0F;
printf("Address=%llu\n", address);

printf("%02X:%02X:%02X:%02X:%02X:%02X\n",
((address >> (5 * 8)) & 0xff),
((address >> (4 * 8)) & 0xff),
((address >> (3 * 8)) & 0xff),
((address >> (2 * 8)) & 0xff),
((address >> (1 * 8)) & 0xff),
(address & 0xff));

printf("%02X:", ((address >> (5 * 8)) & 0xff));
printf("%02X:", ((address >> (4 * 8)) & 0xff));
printf("%02X:", ((address >> (3 * 8)) & 0xff));
printf("%02X:", ((address >> (2 * 8)) & 0xff));
printf("%02X:", ((address >> (1 * 8)) & 0xff));
printf("%02X\n", (address & 0xff));

exit(0);
}

当我在 linux 上编译它时,我得到(如预期的那样):

Address=11042563100175
0A:0B:0C:0D:0E:0F
0A:0B:0C:0D:0E:0F

但是,当我在 MSVC++ 2008 Express 上编译它时,我得到:

Address=11042563100175
0A:00:0B:00:0C:00
0A:0B:0C:0D:0E:0F

我是否错误地格式化了 printf 语句?还是 MSVC 在移位/和操作后在堆栈上留下一个额外的字节?还是其他问题?

注意:使用 MSVC 编译时,您需要使用“.cpp”文件扩展名来强制使用 C++ 模式。我相信这是因为直接 C 模式下的 MSVC 不包括(所有)C99,其中包括 printf 的“%llu”标志。

西蒙。

最佳答案

%X 格式说明符需要一个 32 位参数。您正在传递 64 位,丢掉堆栈。您可以使用 %llX。 CRT 与 C 和 C++ 代码相同。

关于c++ - MSVC++ 处理 unsigned long long int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5414546/

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