当前位置: 首页 > 面试题库 >

我可以假设long int的大小始终为4个字节吗?

凌善
2023-03-14
问题内容

是否总是真的long int(这是我的理解是对的代名词long)是4个字节?

我可以依靠吗?如果不是这样,那么对于基于POSIX的操作系统是否正确?


问题答案:

除了之外,标准没有关于任何整数类型的确切大小char。通常,long在32位系统上为32位,在64位系统上为64位。

但是,该标准并未指定 最小 尺寸。从C标准的 5.2.4.2.1节开始:

1
以下给出的值应被适合用于#if预处理指令的常量表达式代替。此外,除了CHAR_BIT和之外MB_LEN_MAX,以下内容应替换为与根据整数提升转换为相应类型的对象的表达式具有相同类型的表达式。
其实现定义的值的大小(绝对值)应等于或大于所示的相同符号。

  • 类型对象的最小值 long int

LONG_MIN -2147483647 //-(2 ^ 31-1)

  • 类型对象的最大值 long int

LONG_MAX +2147483647 // 2 ^ 31−1

这表示a long int 必须 至少为32位,但可能更大。在CHAR_BIT值为8
的机器上,它的最小字节大小为4。但是,在例如CHAR_BIT等于16的机器上,a long int可以为2个字节长。

这是一个真实的例子。对于以下代码:

#include <stdio.h>

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

在Debian 7 i686上的输出:

sizeof(long)= 4

在CentOS 7 x64上的输出:

sizeof(long)= 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位

所述stdint.h报头在标准的第7.20节中描述7.20.1.1,具有精确宽度的类型。该标准指出,这些typedef是可选的,但它们存在于大多数实现中。



 类似资料:
  • 我有一个有趣的情况,我将存储到中。 现在,奇怪的是,我有一段代码,应该保护,任何坐标都不应该使用两次。但如果我调试这段代码: ...始终返回,尽管我在映射中存储了一个哈希代码为9731的坐标,并且当前coord的哈希代码也为9731。 之后,看起来像: 我可能做错了什么?我没主意了。谢谢你的帮助!

  • C 中的 Integer 变量是占用 2 个字节还是 4 个字节?它所依赖的因素是什么? 大部分教材都说整型变量占用2个字节。但是当我运行一个程序,打印一个整数数组的连续地址时,它显示了4的差异。

  • Microprofile允许从RestClient定义connectionPoolSize,如下所示: 当我在我的项目中设置此属性时,Quarkus会忽略它。我该如何定义它?

  • 问题内容: 我正在启动一个Java jar文件,该文件通常需要比默认的64MB最大堆大小更多的文件。256MB的堆大小足以满足此应用的需求。是否有任何指定(可能在清单中?)启动jar时始终使用最大256MB的堆大小?(如果需要,请在下面提供更多详细信息。) 这是我用Java编写的命令行应用程序,它可以进行一些图像处理。在高分辨率图像(大约12兆像素及以上,这并不罕见)上,我收到OutOfMemor

  • 我有一个并行CRC-32计算器的VHDL代码,需要8字节的输入数据一次。我将称之为“CRC_32_8”模块。