首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >规模(长)=8的体系结构/ABI

规模(长)=8的体系结构/ABI
EN

Stack Overflow用户
提问于 2012-07-15 12:19:22
回答 2查看 1K关注 0票数 12

在x86/amd64 64中,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‘的选择已经写入大多数it 64型操作系统的ABI中,我们不能单方面改变它。
  2. 这实际上是正确的选择,因为它消除了使'long‘不是最广泛的基本积分类型的畸变。有大量的代码在野外编写的假设,sizeof(long) >= sizeof(size_t) -这至少是潜在的破坏ABI,其中长的是比长的。 (在C99开发过程中,这是一个极具争议的话题。据我所知,从外部的角度来看,'long long‘只是因为微软的压力而标准化的,因为微软由于某种原因无法实现LP64模型。其他人都讨厌让'long‘成为最广泛的基本积分类型的想法。)

目前的最佳做法似乎是提供“扩展的整体类型”__int128。这不存在'long long‘的问题,因为它不是基本的整数类型(特别是不能用于size_t)。

zw

long long是最广泛的基本积分类型。在我所知道的任何非死旧的架构/ABIs上,它都有64位长。这允许使用简单的跨平台(嗯,至少对于许多32/64位的体系结构)类型转换:

代码语言:javascript
复制
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 (我很清楚VisualC++从2005年起才支持%lld/%llu )

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

sizeof(long long) != 8**?** 的体系结构/ABI是什么?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-15 12:36:49

TI TMS320C55x体系结构的CHAR_BIT为16位,long long为40位.尽管40位long long违反了国际标准化组织,但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

票数 8
EN

Stack Overflow用户

发布于 2012-07-26 04:50:04

你的“跨平台”字体被误导了。正确的是

代码语言:javascript
复制
#include <stdint.h>
typedef int8_t s8;
typedef uint8_t u8;
typedef int16_t s16;
...
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11491825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档