在128位数字成为现实之前,长64位并保留很长时间是不是更有意义?
答案 0 :(得分:12)
是的,它确实有意义,但微软有自己的理由将“long”定义为32位。
据我所知,在目前所有主流系统中,Windows是唯一一个“长”为32位的操作系统。在Unix和Linux上,它是64位。
Windows的所有编译器都将在Windows上“长”编译为32位,以保持与Microsoft的兼容性。
出于这个原因,我避免使用“int”和“long”。偶尔我会使用“int”表示错误代码和布尔值(在C中),但我从不将它们用于任何依赖于类型大小的代码。
答案 1 :(得分:5)
c标准没有指定原始数据类型的位长,但只指定了它们的最小位长度。因此编译器可以选择原始数据类型的位长度。在决定每种原始数据类型的位长时,编译器设计者应该考虑几个因素,包括计算机体系结构。
这里有一些参考: http://en.wikipedia.org/wiki/C_syntax#Primitive_data_types
答案 2 :(得分:2)
由于历史原因。很长一段时间(双关语),“int”意味着16位;因此“长”为32位。当然,时代变了。因此“漫长”:)
PS:
GCC(和其他)目前支持128位整数为“(u)int128_t”。
PPS:
以下是对GCC成员做出决定的原因的讨论:
http://www.x86-64.org/pipermail/discuss/2005-August/006412.html
答案 3 :(得分:0)
<强> C99 N1256 standard draft 强>
long
和long long
的大小是实现定义的,我们都知道:
5.2.4.2.1整数类型的大小<limits.h>
给出最小尺寸:
1 [...]它们的实现定义值的大小(绝对值)应等于或大于[...]
- UCHAR_MAX 255 // 2 8 - 1
- USHRT_MAX 65535 // 2 16 - 1
- UINT_MAX 65535 // 2 16 - 1
- ULONG_MAX 4294967295 // 2 32 - 1
- ULLONG_MAX 18446744073709551615 // 2 64 - 1
6.2.5类型然后说:
8对于具有相同签名和不同整数转换等级的任何两个整数类型 (见6.3.1.1),具有较小整数转换等级的类型的值范围是a 另一种类型的值的子范围。
和 6.3.1.1布尔,字符和整数确定相对转换排名:
1每个整数类型都有一个整数转换等级,定义如下:
- long long int的等级应大于long int的等级,即 应大于int的等级,其应大于short的等级 int,应大于signed char的等级。
- 任何无符号整数类型的等级应等于相应的等级 有符号整数类型,如果有的话。
- 对于所有整数类型T1,T2和T3,如果T1的等级大于T2且T2具有 比T3更高的排名,那么T1的排名高于T3
答案 4 :(得分:0)
自从用于通用可重编程微型计算机的第一个C编译器的时代以来,代码通常需要使用精确保持8位,16位或32位的类型,但直到1999年标准没有'显式提供程序指定的任何方式。另一方面,几乎所有8位,16位和32位微机的编译器都将“char”定义为8位, “短”为16位,“长”为32位。它们之间唯一的区别是 “int”是16位还是32位。
虽然32位或更大的CPU可以使用“int”作为32位类型,但留下“长” 作为64位类型提供,存在大量期望的代码语料库 “long”将是32位。而C标准增加了“固定大小”类型 在1999年,标准中还有其他地方仍然使用“int”和 “长”,如“printf”。虽然C99添加了宏来提供正确的格式 对于固定大小的整数类型的说明符,有一个实质的语料库 期望“%ld”是int32_t的有效格式说明符的代码,因为 它几乎适用于任何8位,16位或32位平台。
为了让“长”为32位更有意义 现有的代码库可以追溯到几十年,或64位,以避免需要 用于识别64位类型的更详细的“long long”或“int64_t”是 可能是一个判断调用,但鉴于新代码应该有利于 在实际使用指定大小的类型时,我不确定我是否看到引人注目的 除了“int”也是64位(这将是64位)之外,制作“长”64位的优势 使用现有代码创建更大的问题。)
答案 5 :(得分:0)
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添加了宏来提供