12

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

让我引用扎克·温伯格(Zack Weinberg)颇有见地的 8 年邮件

斯科特·罗伯特·拉德写道:

在 64 位 AMD64 架构上,GCC 定义long long为 64 位,与long.

long long鉴于某些 64 位指令(乘法)产生 128 位结果,将其定义为 128 位似乎不合逻辑吗?

不,有两个原因:

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

  2. 这实际上是正确的选择,因为它消除了使 ' long' 不是最广泛的基本整数类型的像差。在野外有很多代码是为了假设 sizeof(long) >= sizeof(size_t)- 这至少可能被 ABI 破坏,其中 long long 比 long 更宽。

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

当前的最佳做法似乎是提供“扩展整数类型” __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++ 支持%lld/%llu仅自 2005 年起)

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


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

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

4

2 回答 2

8

TI TMS320C55x 架构有CHAR_BIT16 位和long long40 位。虽然 40 位long long违反 ISO,但sizeof (long long)与 8 不同。

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

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

于 2012-07-15T12:36:49.680 回答
-1

您的“跨平台”类型定义只是被误导了。正确的是

#include <stdint.h>
typedef int8_t s8;
typedef uint8_t u8;
typedef int16_t s16;
...
于 2012-07-26T04:50:04.067 回答