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

时间:2012-07-15 12:19:23

标签: c abi

在x86 / amd64中,sizeof(long long)为8。

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

  斯科特罗伯特拉德写道:

     
    

在64位AMD64架构上,GCC将long long定义为64位,即     与long相同。

         

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

  
     

不,有两个原因:

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

  2.   
  3. 这实际上是正确的选择,因为它消除了像差   这使得'long'不是最宽的基本积分类型。有   在野外写下了很多很多代码   sizeof(long) >= sizeof(size_t) - 这至少是潜在的   由ABI打破,其中长多头比较长。

         

    (这是一个极具争议的话题   C99。从外部角度来看,我可以说“long long”   由于微软的压力无法实现,因此只是标准化了   某种原因实现了LP64模型。其他人都讨厌这个想法   使'long'不一定是最宽的基本积分类型。)

  4.         

    目前最佳做法似乎是提供“扩展积分   输入“__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;

intXX_t好,因为:

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

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


sizeof(long long) != 8哪些架构/ ABI?

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

2 个答案:

答案 0 :(得分: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 :(得分:-1)

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

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