我正在自己在线学习C编程,这样我就可以为2016年冬季的大学做好准备。我现在正在学习数据类型。 我不明白它们之间的区别:
short
long
long long integers in C programming
我在线查看,但我仍然对如何使用这些以及何时使用感到困惑。 谢谢。
答案 0 :(得分:10)
C最初是为16位机器编写的,其中最快和最方便的整数大小是16位。这是原始的int
类型。有时,程序员需要32位数字,因此那些是long int
类型。
在适当的时候,人们将C移植到32位机器,其中最方便的字大小是32位。他们希望继续使用int
来表示原生单词大小,因为例如现实世界中的每个C程序都在其中有int i;
,但有时,他们还需要使用16位数字节省空间。所以那些成为short int
类型。
时间过去了,C需要移植到64位计算机上。到那时,存在许多程序,假设long
正好是32位宽,不幸的是,许多程序也认为long
与指针的大小相同, IPv4地址,文件偏移,时间戳等。优秀代码使用size_t
,uintptr_t
和off_t
等类型,但旧版本的系统库将其库函数定义为使用long
,因此许多遗留代码也必须如此。自从C99问世以来,标准库中也有类似int32_t
这样的类型来指定精确的宽度,而Unix和Windows已经在不同的名称下使用它们了一段时间。
由于这些类型被用来表示相互矛盾的事情,今天的编译器为程序员提供了long
在32位和64位宽之间的选择,而64位编译器让int
为32或者64位宽。至少有一个真正的编译器将int
定义为64位(本机字长),但将long
定义为32位(因此系统库和代码仍可正常工作)。标准委员会禁止在C11中:long long int
现在保证至少与long int
一样宽,long int
至少与int
一样宽。
因为许多程序无法在不中断的情况下将long
重新定义为64位,所以C需要一个意味着(至少)64位的新类型。到那时,标准委员会不愿在头文件之外引入新的关键字,因此他们重新使用现有的关键字,并将其命名为long long int
。
简而言之,您不应该假设int
和long
的意思超出int
至少16位宽且快,long
至少32位宽,在C11编译器上long
至少与int
一样宽但不宽于long long
。出于一般目的,请使用int
。如果您需要数组索引,请使用size_t
或ptrdiff_t
。如果你想确定你可以保持一个超过32,767的数字,并且认真地期望有一天你可能需要在某个16位机器上运行,请使用long
或来自<inttypes.h>
的快速类型。如果您正在进行系统调用,请使用与其参数相同的类型。如果要将指针存储在整数类型中,请使用uintptr_t
。如果您需要一个至少64位宽的数字,请使用long long
,如果您确切知道所需的宽度,请使用精确宽度类型。
答案 1 :(得分:1)
它们只是不同的数据类型。它们有不同的范围。所有存储整数,但消耗不同的内存并具有不同的范围。例如:short int
消耗16位,long int
消耗32位,long long int
消耗64位。 short int
的最大值为32767.因此,您需要存储使用long int
所需的大值。 Long long int
是最大的,它可以存储多达20个!
更多解释和范围可在Wikipedia page最佳!