Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么C编译器将long指定为32位,将long指定为64位?_C_32bit 64bit_Long Integer_Bit_Long Long - Fatal编程技术网

为什么C编译器将long指定为32位,将long指定为64位?

为什么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位

将64位设为long并保留long long,直到128位数字成为现实,这难道不是更有意义吗?

出于历史原因。很长一段时间(双关语的意思),“int”表示16位;因此“long”为32位。当然,时代变了。因此“long long”:

附言:

GCC(和其他)目前支持128位整数,如“(u)int128_t”

缴费灵:

下面讨论了GCC的员工为什么做出这样的决定:


是的,这是有道理的,但微软将“long”定义为32位有自己的理由

据我所知,在目前所有主流系统中,Windows是唯一一个“长”为32位的操作系统。在Unix和Linux上,它是64位的

所有Windows编译器都将在Windows上将“long”编译为32位,以保持与Microsoft的兼容性


因此,我避免使用“int”和“long”。偶尔我会对错误代码和布尔值(在C中)使用“int”,但我从不将它们用于依赖于类型大小的任何代码。

C标准没有指定基元数据类型的位长度,只指定它们的最小位长度。因此编译器可以选择基本数据类型的位长度。在决定每个基元数据类型的位长时,编译器设计者应该考虑几个因素,包括计算机体系结构。 以下是一些参考资料:

long
long
的大小由实现定义,我们只知道:

  • 最小尺寸保证
  • 类型之间的相对大小
5.2.4.2.1整数类型的尺寸
给出了最小尺寸:

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− 一,
6.2.5类型然后表示:

8用于具有相同符号性和不同整数转换秩的任意两个整数类型 (见6.3.1.1),整数转换秩较小的类型的值范围为a 其他类型的值的子范围

和6.3.1.1布尔、字符和整数决定相对转换等级:

1每个整数类型都有一个整数转换秩,定义如下:

  • 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位系统上,它们都会有所不同,但那些日子已经一去不复返了