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

时间:2011-09-02 05:20:24

标签: c 32bit-64bit long-integer bit long-long

在128位数字成为现实之前,长64位并保留很长时间是不是更有意义?

6 个答案:

答案 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

longlong 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添加了宏来提供