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

bttbmeg0  于 2022-12-17  发布在  其他
关注(0)|答案(7)|浏览(370)

让长64位和保留long long直到128位数字成为现实不是更有意义吗?

b5buobof

b5buobof1#

是的,这确实有道理,但微软有自己的理由将“长”定义为32位。
据我所知,在目前所有主流系统中,Windows是唯一一个long是32位的操作系统,而Unix和Linux是64位的。
所有Windows版编译器都将在Windows上将“long”编译为32位,以保持与Microsoft的兼容性。
出于这个原因,我避免使用“int”和“long”。偶尔我会用“int”表示错误代码和布尔值(在C中),但我从不对任何依赖于类型大小的代码使用它们。

siv3szwd

siv3szwd2#

C语言标准没有规定原语数据类型的位长,而只规定了原语数据类型的最小位长。因此,编译器可以选择原语数据类型的位长。在决定每种原语数据类型的位长时,编译器设计者应考虑几个因素,包括计算机体系结构。
以下是一些参考资料:http://en.wikipedia.org/wiki/C_syntax#Primitive_data_types

qyzbxkaa

qyzbxkaa3#

由于历史原因,在很长一段时间里(双关语),“int”意味着16位;因此“long”为32位。当然,时代变了。因此“long long”:)
附言:
GCC(和其他)目前支持128位整数,如“(u)int128_t”。
PPS:
下面讨论一下为什么GCC的人会做出这样的决定:
http://www.x86-64.org/pipermail/discuss/2005-August/006412.html

70gysomp

70gysomp4#

自从第一个用于通用可重编程微型计算机的C编译器问世以来,代码经常需要使用正好包含8、16或32位的类型,但直到1999年,标准才明确提供任何方法让程序指定这一点。另一方面,几乎所有用于8位、16位、和32位微型计算机定义“char”为8位,“short”为16位,“long”为32位,它们之间的区别只是“int”是16位还是32位。
虽然32位或更大的CPU可以使用“int”作为32位类型,而“long”作为64位类型可用,但有大量代码预计“long”将是32位。虽然C标准在1999年添加了“固定大小”类型,但标准中还有其他地方仍然使用“int”和“long”,虽然C99添加了宏来为固定大小的整数类型提供正确的格式说明符,但有大量代码集期望“%ld”是int32_t的有效格式说明符,因为它将在几乎任何8位、16位或32位平台上工作。
考虑到几十年前的现有代码库,让“long”为32位更有意义,还是让“long”为64位更有意义,以避免使用更冗长的“long long”或“int64_t”来标识64位类型,这可能是一个判断,但如果新代码在实际情况下可能更倾向于使用指定大小的类型,除非“int”也是64位(这将给现有代码带来更大的问题),否则我不确定是否看到了使“long”为64位的引人注目的优势。

t9aqgxwy

t9aqgxwy5#

d 32位微型计算机将“char”定义为8位,“short”定义为16位,“long”定义为32位,它们之间唯一的区别是“int”是16位还是32位。
虽然32位或更大的CPU可以使用“int”作为32位类型,而“long”作为64位类型可用,但有大量代码预计“long”将是32位。虽然C标准在1999年添加了“固定大小”类型,但标准中还有其他地方仍然使用“int”和“long”,例如“printf”。而C99添加了宏来提供

htrmnn0y

htrmnn0y6#

对于历史,包括为什么UNIX系统通常集中在LP 64上,为什么Windows没有(大的代码库,有int 16和long 32),以及各种争论:通往64位的漫漫长路--双重、双重、辛劳和麻烦--莎士比亚、麦克白https://queue.acm.org/detail.cfm?id=1165766队列2006或https://dl.acm.org/doi/pdf/10.1145/1435417.1435431 CACM 2009
注:我帮助设计了64/32位MIPS R4000,提出了导致C99的想法<inttypes.h>,并为C99编写了长长的动机部分。

dldeef67

dldeef677#

    • 一个

longlong long的大小由实现定义,我们所知道的是:

  • 最小尺寸保证
  • 类型之间的相对大小
  • 5.2.4.2.1整数类型的大小<limits.h> * 给出了最小大小:

1 [...]它们的实现定义值在幅度(绝对值)上应等于或大于所示值[...]

  • 255//2 8 - 1/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/8/
  • 超滤停留时间_最大值65535//2 16 − 1
  • UINT_最大值65535//2 16 − 1
  • 超长_最大值4294967295//2 32 − 1
  • 超长_最大值18446744073709551615//2 64 − 1
  • 6.2.5类型 * 然后说:

8 For any two integer types with the same signedness and different integer conversion rank (see 6.3.1.1), the range of values of the type with smaller integer conversion rank is a subrange of the values of the other type.
和 * 6.3.1.1布尔、字符和整数 * 确定相对转换等级:
1每个整数类型都有一个整数转换秩,定义如下:

  • long long int的秩应该大于long int的秩,long int的秩应该大于int的秩,int的秩应该大于short int的秩,short int的秩应该大于signed char的秩。
  • 任何无符号整数类型的秩都应等于相应的有符号整数类型的秩(如果有)。
  • 对于所有整数类型T1、T2和T3,如果T1的秩大于T2且T2的秩大于T3,则T1的秩大于T3

相关问题