为什么我需要在printf负整数值时进行类型转换

syk*_*yko -1 c++

以下代码打印一个非常大的整数值,而不是-1.

int64_t num = -1
printf("%lld",num);
Run Code Online (Sandbox Code Playgroud)

我需要输入cast来打印-1.

printf("%lld",(int64_t) num);
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么?这是标准的吗?或不确定的行为,可能会有所不同,具体取决于系统平台?

我使用x86 intel处理器和intel icc编译器.

Bat*_*eba 5

我相信你的代码没有严格定义.

为了输出一个int64_t类型(如果你的编译器支持它,必须是2的补码64位signed类型),你需要先写

#include <cinttypes>
Run Code Online (Sandbox Code Playgroud)

然后使用PRId64格式specfier:

printf("%" PRId64, num);
Run Code Online (Sandbox Code Playgroud)

如果您具有C++的比较奢侈品,那么假设您的平台实现了该类型,您可以使用相当简单且std::cout具有适当重载的int64_t.