为什么C编译器将long指定为32位,将long指定为64位?
将64位设为long并保留long long,直到128位数字成为现实,这难道不是更有意义吗?出于历史原因。很长一段时间(双关语的意思),“int”表示16位;因此“long”为32位。当然,时代变了。因此“long long”: 附言: GCC(和其他)目前支持128位整数,如“(u)int128_t” 缴费灵: 下面讨论了GCC的员工为什么做出这样的决定:为什么C编译器将long指定为32位,将long指定为64位?,c,32bit-64bit,long-integer,bit,long-long,C,32bit 64bit,Long Integer,Bit,Long Long,将64位设为long并保留long long,直到128位数字成为现实,这难道不是更有意义吗?出于历史原因。很长一段时间(双关语的意思),“int”表示16位;因此“long”为32位。当然,时代变了。因此“long long”: 附言: GCC(和其他)目前支持128位整数,如“(u)int128_t” 缴费灵: 下面讨论了GCC的员工为什么做出这样的决定: 是的,这是有道理的,但微软将“long”定义为32位有自己的理由 据我所知,在目前所有主流系统中,Windows是唯一一个“长”为32位
是的,这是有道理的,但微软将“long”定义为32位有自己的理由 据我所知,在目前所有主流系统中,Windows是唯一一个“长”为32位的操作系统。在Unix和Linux上,它是64位的 所有Windows编译器都将在Windows上将“long”编译为32位,以保持与Microsoft的兼容性
因此,我避免使用“int”和“long”。偶尔我会对错误代码和布尔值(在C中)使用“int”,但我从不将它们用于依赖于类型大小的任何代码。C标准没有指定基元数据类型的位长度,只指定它们的最小位长度。因此编译器可以选择基本数据类型的位长度。在决定每个基元数据类型的位长时,编译器设计者应该考虑几个因素,包括计算机体系结构。 以下是一些参考资料:
long
和long
的大小由实现定义,我们只知道:
- 最小尺寸保证
- 类型之间的相对大小
给出了最小尺寸:
1[…]其实施定义值的大小(绝对值)应等于或大于所示值[…]
- UCHAR_最大值255//2 8− 一,
- USHRT_MAX 65535//2 16− 一,
- UINT_MAX 65535//2 16− 一,
- ULONG_MAX 4294967295//2 32− 一,
- ULLONG_MAX 18446744073709551615//2 64− 一,
- long-long-int的等级应大于long-int的等级,即 应大于int的秩,int的秩应大于short的秩 int,它应大于有符号字符的秩
- 任何无符号整数类型的秩应等于相应整数类型的秩 有符号整数类型(如果有)
- 对于所有整数类型T1、T2和T3,如果T1的秩大于T2,则T2 等级大于T3,则T1的等级大于T3
自从通用可重编程微型计算机的第一个C编译器问世以来,代码常常需要使用正好包含8位、16位或32位的类型,但直到1999年,该标准才明确规定程序可以使用这种类型。另一方面,几乎所有用于8位、16位和32位微型计算机的编译器都将“char”定义为8位, “短”为16位,“长”为32位。他们之间唯一的区别是 “int”是16位还是32位 而32位或更大的CPU可以使用“int”作为32位类型,留下“long” 作为64位类型提供,有大量的代码 “long”将是32位。而C标准增加了“固定大小”类型 1999年,标准中还有其他地方仍然使用“int”和 “long”,如“printf”。C99添加了宏以提供正确的格式 对于固定大小的整数类型,有大量 期望“%ld”是int32\u t的有效格式说明符的代码,因为 它可以在任何8位、16位或32位平台上工作 出于对数据的尊重,将“long”设为32位是否更有意义 现有的代码库可以追溯到几十年前,即64位,以避免 标识64位类型的更详细的“long long”或“int64_t”是 可能是一种判断,但考虑到新的代码可能有利于 如果实际使用指定的大小类型,我不确定我是否看到了令人信服的结果 除非“int”也是64位(这将
32位微型计算机将“字符”定义为8位,“短”定义为16位,“长”定义为32位。它们之间唯一的区别是“int”是16位还是32位
虽然32位或更大的CPU可以使用“int”作为32位类型,而“long”可以作为64位类型使用,但有大量代码预计“long”将为32位。虽然C标准在1999年增加了“固定大小”类型,但标准中还有其他地方仍然使用“int”和“long”,如“printf”。C99增加了宏来提供两件事:首先,long不一定是64位。第二,不是建议它是128位宽的吗?我们应该准备让1024位硬件变得普通,对吗?实际上“C编译器”没有指定
long
是32位,也没有指定int
是32位,也没有指定long
是64位。这在很大程度上取决于编译器。。。所以你的问题基于一个错误的前提。他们最终在C99中做到了:@seljuq70:long
不能被“保留”,因为C99标准保证了它的存在。在具有16位int
、32位long
和64位long
的16位系统上,它们都会有所不同,但那些日子已经一去不复返了