gpt4 book ai didi

C99: 为什么 %lli 在 64 位机器上不匹配 int64_t ?

转载 作者:行者123 更新时间:2023-11-30 16:59:21 25 4
gpt4 key购买 nike

我将 32 位 ARM 代码移植到 64 位 x86 并遇到以下错误:

format '%lli' expects argument of type 'long long int',
but argument 3 has type 'int64_t'

我发现了很多有关在这种情况下使用 PRIi64 的信息,但没有找到有关“为什么我不能使用 lli?”的信息。

#include <stdio.h>
#include <inttypes.h>

int main() {
int64_t hugo = 993;
long long int fred = 994;
printf("%s -> %" PRIi64 " lli -> %lli\n", PRIi64, hugo, fred);
return 0;
}

上面的代码编译没有错误并打印 li -> 993 lli -> 994。那么,如果 int64_t(8 字节)我需要 li ,而 long long int (8 字节)需要 lli ,如果两者具有相同的大小,为什么?

我发现一篇文章说,这是可移植性问题警告。那么关闭这个警告就可以了吗? (我发现的唯一标志是 -Wno-format,它禁用了很多检查...)

最佳答案

在编写标准时,许多实现都有两个或多个具有相同大小和表示形式的整数类型;最典型的是 int将具有与 short 相同的大小和表示形式或long .

即使在大小和表示相匹配的平台上,也可以从 int* 进行转换到 short*long*需要强制转换,但在对两种(或更多)类型使用相同表示的实现中,指向其中一个类型的指针可用于访问另一个类型的数据。对这种用法的支持并不被认为是 C 的“扩展”,而更多的是“好吧,它还能做什么?”这看起来很明显,不需要文档(*)

然而,gcc 的作者假设不会使用指向非字符整数类型的指针来访问任何其他非字符整数类型的内容 -即使是那些大小和表示形式相同的内容 。自 printf将使用 long long int*读取 %lld 的参数,一个long*阅读 %ld 的一篇,以及 int*阅读 %d 的一篇,gcc 的作者会查看任何使用 %lld 的尝试。处理 int64_t 类型的参数作为该类型定义为 long long 以外的其他类型的实现上的未定义行为,即使其大小和表示形式符合预期。

(*)虽然 C89 要求记录所有“扩展”,但列出常见扩展的附件并未列出它。由于该标准的作者不可能没有意识到许多(如果不是大多数)编译器具有两个或多个共享相同大小和表示形式的整数类型,并允许指向这些类型的指针可以互换使用,因此唯一合理的结论是是他们不认为这种行为是需要文档的“扩展”。

关于C99: 为什么 %lli 在 64 位机器上不匹配 int64_t ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38180409/

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