首页 文章

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

提问于
浏览
12

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

让我引用颇具洞察力的8岁mail by Zack Weinberg

Scott Robert Ladd写道:在64位AMD64架构上,GCC将long长定义为64位,与长整数相同 . 假设某些64位指令(乘法)产生128位结果,那么long long定义为128位似乎不合逻辑吗?不,有两个原因:64位“long long”的选择已被写入大多数LP64模型操作系统的ABI中;我们不能单方面改变它 . 这实际上是正确的选择,因为它消除了使“长”不是最宽的基本积分类型的像差 . 野外有很多很多代码写成sizeof(long)> = sizeof(size_t)的假设 - 这至少可能被长期宽于长的ABI所破坏 . (在C99的开发过程中,这是一个极具争议的话题 . 从外部角度来看,“长期”只是由于微软的压力而标准化,因为微软不能出于某种原因实施LP64模型 . 讨厌让'long'不一定是最宽泛的基本积分类型的想法 . )目前最好的做法似乎是提供一个“扩展积分型”__int128 . 这没有'long long'的问题,因为它不是基本的整数类型(特别是它不能用于size_t) . ZW


long long 是最宽的 basic 整数类型 . 在我所知道的任何非死亡架构/ 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;

intXX_t 更好,因为:

  • 他们在不同平台上对64位整数使用相同的底层类型

  • 允许避免冗长 PRId64 / PRIu64
    (我很清楚,自2005年以来,Visual C仅支持 %lld / %llu

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


What are the architectures/ABIs where sizeof(long long) != 8?

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

2 回答

  • 8

    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

  • -1

    您的“跨平台”typedef只是被误导了 . 正确的是

    #include <stdint.h>
    typedef int8_t s8;
    typedef uint8_t u8;
    typedef int16_t s16;
    ...
    

相关问题