gpt4 book ai didi

c - sizeof(long long) != 8 的架构/ABI

转载 作者:太空狗 更新时间:2023-10-29 16:41:39 25 4
gpt4 key购买 nike

在 x86/amd64 世界中 sizeof(long long) 是 8。

让我引用颇有见地的8岁mail by Zack Weinberg :

Scott Robert Ladd writes:

On a 64-bit AMD64 architecture, GCC defines long long as 64 bits, the same as a long.

Given that certain 64-bit instructions (multiply) produce 128-bit results, doesn't it seem logical the long long be defined as 128 bits?

不,有两个原因:

  1. 64位的'long long'的选择已经写入了ABI 大多数 LP64 模型操作系统;我们不能单方面改变它。

  2. 这实际上是正确的选择,因为它消除了像差 这使得 'long' 不是最宽的基本整数类型。有 很多很多的代码都是基于这样的假设编写的 sizeof(long) >= sizeof(size_t) - 这至少是潜在的 被 long long 比 long 宽的 ABI 打破。

    (在开发过程中,这是一个极具争议的话题 C99。据我所知,从外部角度来看,'long long' 只是由于微软的压力而无法标准化 出于某种原因实现 LP64 模型。其他人都讨厌这个主意 使 'long' 不一定是最宽的基本整数类型。)

当前的最佳实践似乎是提供一个“扩展积分 type"__int128。这没有 'long long' 的问题,因为 它不是基本整数类型(特别是,它不能用于 size_t).

zw


long long 是最宽的基本整型。它在我所知道的任何非死旧架构/ABI 上都是 64 位长。这允许使用简单的跨平台(好吧,至少对于许多 32/64 位架构)类型定义:

typedef char               s8;
typedef unsigned char u8;
typedef short s16;
typedef unsigned short u16;
typedef int s32;
typedef unsigned int u32;
typedef long long s64;
typedef unsigned long long u64;

intXX_t 更好,因为:

  • 他们在不同平台上对 64 位整数使用相同的底层类型
  • 允许避免冗长的PRId64/PRIu64
    (我很清楚 Visual C++ 仅从 2005 年开始支持 %lld/%llu)

但是这个解决方案的可移植性如何可以通过以下问题的答案来表达。


sizeof(long long) != 8 的架构/ABI 是什么?

如果您不能提供任何最新的/现代的,那么继续使用旧的,但前提是它们仍在使用中。

最佳答案

TI TMS320C55x架构有16位的CHAR_BIT和40位的long long。虽然 40 位的 long long 违反了 ISO,但是 sizeof (long long) 与 8 不同。

实际上,几乎所有带有 CHAR_BIT > 8 的 C99 实现都有 sizeof (long long) != 8

TMS320C55x 优化 C/C++ 编译器用户指南 (2003) http://www.ti.com/lit/ug/spru281f/spru281f.pdf

关于c - sizeof(long long) != 8 的架构/ABI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11491825/

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