在x86/amd64 64中,sizeof(long long)是8。
让我引用颇有洞察力的8岁mail by Zack Weinberg
斯科特·罗伯特·拉德写道: 在64位AMD64体系结构上,GCC将
long long定义为64位,与long相同. 假设某些64位指令(乘)产生128位结果,那么long long被定义为128位难道不符合逻辑吗?不,原因有二:
long long‘的选择已经写入大多数it 64型操作系统的ABI中,我们不能单方面改变它。long‘不是最广泛的基本积分类型的畸变。有大量的代码在野外编写的假设,sizeof(long) >= sizeof(size_t) -这至少是潜在的破坏ABI,其中长的是比长的。
(在C99开发过程中,这是一个极具争议的话题。据我所知,从外部的角度来看,'long long‘只是因为微软的压力而标准化的,因为微软由于某种原因无法实现LP64模型。其他人都讨厌让'long‘成为最广泛的基本积分类型的想法。)目前的最佳做法似乎是提供“扩展的整体类型”__int128。这不存在'long long‘的问题,因为它不是基本的整数类型(特别是不能用于size_t)。
zw
long long是最广泛的基本积分类型。在我所知道的任何非死旧的架构/ABIs上,它都有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好,因为:
PRId64/PRIu64
(我很清楚VisualC++从2005年起才支持%lld/%llu )但是这个解决方案的可移植性可以用以下问题的答案来表达。
sizeof(long long) != 8**?** 的体系结构/ABI是什么?
如果你不能提供任何新的/现代的,那就继续使用旧的,但前提是它们还在使用中。
发布于 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
发布于 2012-07-26 04:50:04
你的“跨平台”字体被误导了。正确的是
#include <stdint.h>
typedef int8_t s8;
typedef uint8_t u8;
typedef int16_t s16;
...https://stackoverflow.com/questions/11491825
复制相似问题