为什么用C发明short,int和long?


16

我无法理解,是什么创造的确切目的shortint以及long在C数据类型?

我问的原因是,似乎它们的大小似乎没有界限-例如,它们可以是任意大小,只要short小于即可int

那么,在哪种情况下,如果您不希望二进制兼容,则应该使用unsigned intunsigned long而不是来代替size_t

(如果您不知道大小,那么您如何知道何时选择哪个?)


2
<stdint.h>

1
@BlackJack:我确实有哈哈-但是我想我的问题是,为什么不是所有这些类型都本机定义?是“事后认识是20/20”问题,还是有特定原因?
2011年

2
C的意图是既可移植又可与基础硬件接近。在某些平台上字节不是8位长-但是您仍然可以使用C。没有固定的数据类型集就足够了,没有固定大小的整数可以移植。
SK-logic

@ SK-logic:即使他们说sizeof(short) == 2 * sizeof(char)或类似的话也不?
user541686 2011年

1
在平台上sizeof(char) == sizeof(short),这很有意义。不幸的是,无法指定整数类型以使其适合所有 可能的平台和现有平台。
SK-logic

Answers:


12

它由您使用的体系结构定义。在Zilog z80芯片(通用嵌入式芯片)上,它们将是一种尺寸,而在x86芯片组上它们可能是完全不同的尺寸。但是,大小本身是固定的比率。本质上,short和long不是类型,但符合int类型。短整数将比(常规)整数小一个数量级,而长整数将比整数高一个数量级。因此,可以说您的Int绑定到4个字节,虽然2个字节也很常见,但short限定符将其限制为4个字节,long qualifier可能将其扩展为8个字节,尽管可以减少到4个字节。请记住,这也受字长的影响,因此在32位系统上,每个int的最大长度为4字节,因此与常规int一样长。因此,Short≤Int≤Long。

但是,如果再次加长,则可以将int推入下一个单元格,从而为您提供8个完整的存储字节。这是64位计算机的字长,因此他们不必担心此类事情,只需将一个单元格用于长整数,就可以使它们比标准整数高出另一位,而长整数却可以得到一点点。

至于选择哪个,可以归结为例如Java程序员不必担心的事情。“你的建筑是什么?” 由于这完全取决于所讨论的机器的内存字大小,因此在决定使用哪个字之前,您必须先了解它。然后,选择最小的合理大小以节省尽可能多的内存,因为无论您是否使用其中的所有位,都会分配该内存。因此,您可以节省空间,在可以的情况下选择短裤,在不可以的情况下选择短裤,并且如果需要的东西比常规值大;您会根据需要加长,直到达到上限。然后,您需要提供大量例程或从库中获取它们。

C可能是“便携式程序集”,但您仍然必须了解您的硬件。


11
这是不完全正确,短裤没有比整数小,它们不能比整数更大
JK。

我会改正的。

2
同样,long不能小于ints。
Donal Fellows,

1
的确,我相信有些机器的short,int和long完全相同。
jk。

6

尽管今天的“字节”表示“ 8位”,但这并不总是正确的。机器使用了4位,8位,12位,16位,32位和36位(可能还有其他一些大小)的可寻址块。C的设计意图之一是可以在具有不同内存大小和配置的机器上使用。

我认为设计的初衷是,每种类型都不int是可以处理各种尺寸的最小的东西,并且int是可以处理+/- 32767的最实用的“通用”尺寸。我认为,当计算机变得如此强大以至于对64位数字进行操作所花费的成本与对较小数字进行操作所花费的语言相同时,我没有任何意愿或意图创建这种语言。

C的整数类型语义的最大问题是,在某些情况下,它们表示基数或数学整数,而在其他情况下,它们用于表示整数的环绕抽象代数环的成员,等价的mod 2 ^ n [例如,减去从0表示的最大可表示值被定义为产生1],但是行为的指定更多地取决于编译器似乎在计算机字长约为16位(而36位字长会非常大)的时代),而不是基于在64位计算机上有意义的内容。因此,从较小的无符号32位值中减去32位无符号值的结果可能是较大的32位无符号值,也可能是负的64位数字。


4

/programming/589575/size-of-int-long-etc

因此,在最常用的体系结构中,char是1个字节,short和int至少是2个字节,long是至少4个字节。

旨在使“ int”成为当前CPU的最自然/正常/高效的表示形式。

因此,一般规则是使用“ int”,除非您的值超过+/- 32K,这使您(在较旧的CPU上)使用“ long”。...或者除非您要创建一个大型数组,这些数组的值较小(<32K),并且内存是个问题-所以您将使用'short'来节省内存(或者可能是'char'或'byte')。


2
但是使用64位,int几乎不是一个好选择,对吗?为了避免移植代码的问题,我几乎总是总是使用size_t(甚至ptrdiff_t!)。
2011年

@Merhdad-int曾经是最佳选择,它被定义为硬件的“标准单位”,通常是指针的大小。如今,为了安全起见,请使用size_t。
马丁·贝克特

1

C旨在主动处理不同级别的内存。在某些情况下,由于内存限制,体系结构等原因,short,int和long之间的差异以及float和double之间的差异很重要。尽管现在影响不大,但仍有环境在其中起作用(例如,嵌入式和嵌入式)。在数据量很大的情况下),并且从主要的32位架构过渡到64位使它再次成为一个问题。(在十到二十年中,当我们过渡到128位体系结构并且C / C ++仍然很流行时,这将再次成为一个问题)。正确的是,二进制兼容性会受到影响,这就是为什么您不想在重要的地方使用这些变量类型大小的原因。

您询问如果不知道大小如何知道要使用哪个,但是您确实知道给定的体系结构/编译器组合的大小,并且如果需要在该级别优化内存,则最好知道。您不能仅仅跨平台优化它,因为您不知道它们的大小,因此您不想为此目的使用这些功能。但是,许多用C编写的东西都是特定于平台的,尽管采用了“跨平台”的方式,但确实可以进行一些有利的优化。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.