首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以假设长int的大小总是4个字节吗?

我可以假设长int的大小总是4个字节吗?
EN

Stack Overflow用户
提问于 2016-03-07 13:07:45
回答 10查看 35.6K关注 0票数 78

long int (据我所知,它是long的同义词)总是4字节吗?

我能依赖这个吗?如果不是,基于POSIX的操作系统会是真的吗?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2016-03-07 13:11:13

除了char之外,这些标准没有提到任何整数类型的确切大小。通常,32位系统上的long是32位,64位系统上是64位.

但是,标准确实指定了最小大小。来自C标准 5.2.4.2.1节

1下列数值应由适合于#if预处理指令的常量表达式取代。此外,除CHAR_BITMB_LEN_MAX外,以下内容应替换为具有与根据整数提升转换的相应类型的对象的表达式相同类型的表达式。其实现定义的值应等于或大于所示值(绝对值),并具有相同的符号。。 ..。

  • long int类型对象的最小值 LONG_MIN -2147483647 //−(2^31−1)
  • long int类型对象的最大值 LONG_MAX +2147483647 // 2^31−1

这意味着long int必须至少为32位,但可能更大。在CHAR_BIT为8的机器上,最小字节大小为4。但是,在机器上,例如CHAR_BIT等于16时,long int可以是2字节长。

这是一个现实世界的例子。关于下列代码:

代码语言:javascript
运行
复制
#include <stdio.h>

int main ()
{
    printf("sizeof(long) = %zu\n", sizeof(long));
    return 0;
}

在Debian 7 i686上的输出:

尺寸(长)=4

CentOS 7 x64上的输出:

尺寸(长)=8

所以不,你不能对尺寸做任何假设。如果需要特定大小的类型,可以使用stdint.h中定义的类型。它定义了以下类型:

  • int8_t:签名8位
  • uint8_t:无符号8位
  • int16_t:签名16位
  • uint16_t:无符号16位
  • int32_t:签名32位
  • uint32_t:无符号32位
  • int64_t:签名64位
  • uint64_t:无符号64位

标准的7.20节描述了stdint.h标头,7.20.1.1节中有精确的宽度类型。标准声明这些类型防御是可选的,但它们存在于大多数实现中。

票数 118
EN

Stack Overflow用户

发布于 2016-03-07 13:12:46

不,无论是C标准还是POSIX都不能保证这一点,实际上大多数类似Unix的64位平台有64位(8字节) long

票数 39
EN

Stack Overflow用户

发布于 2016-03-07 13:12:13

使用代码sizeof(long int)并检查大小。它将给出您当前工作的系统上长int的大小(以字节为单位)。你的问题的答案是否定的。它在C或POSIX或任何地方都没有得到保证。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35844586

复制
相关文章

相似问题

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