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

prz*_*moc 12 c abi

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

让我引用Zack Weinberg发来的具有洞察力的8年历史的邮件:

Scott Robert Ladd写道:

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

鉴于某些64位指令(乘法)产生128位结果,看起来是不是逻辑上long long被定义为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:

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;
Run Code Online (Sandbox Code Playgroud)

比那更好intXX_t,因为:

  • 它们在不同平台上使用相同的底层类型用于64位整数
  • 允许避免详细PRId64/ PRIu64
    (我很清楚Visual C++支持%lld/ %llu仅自2005年以来)

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


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

如果你不能提供任何近期/现代的,那么继续使用旧的,但只有当它们仍在使用时.

oua*_*uah 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

  • 应该重命名"稍长"的类型以避免ISO冲突. (2认同)
  • @ugoren实际上`sizeof(long long)== 4`在这个架构中.剩余的24位是填充位. (2认同)