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添加了宏来提供
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的秩。
7条答案
按热度按时间b5buobof1#
是的,这确实有道理,但微软有自己的理由将“长”定义为32位。
据我所知,在目前所有主流系统中,Windows是唯一一个long是32位的操作系统,而Unix和Linux是64位的。
所有Windows版编译器都将在Windows上将“long”编译为32位,以保持与Microsoft的兼容性。
出于这个原因,我避免使用“int”和“long”。偶尔我会用“int”表示错误代码和布尔值(在C中),但我从不对任何依赖于类型大小的代码使用它们。
siv3szwd2#
C语言标准没有规定原语数据类型的位长,而只规定了原语数据类型的最小位长。因此,编译器可以选择原语数据类型的位长。在决定每种原语数据类型的位长时,编译器设计者应考虑几个因素,包括计算机体系结构。
以下是一些参考资料:http://en.wikipedia.org/wiki/C_syntax#Primitive_data_types
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
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位的引人注目的优势。
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添加了宏来提供
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编写了长长的动机部分。
dldeef677#
long
和long long
的大小由实现定义,我们所知道的是:<limits.h>
* 给出了最小大小:1 [...]它们的实现定义值在幅度(绝对值)上应等于或大于所示值[...]
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每个整数类型都有一个整数转换秩,定义如下: