很长的 Int C/C++ - 重点是什么?

MGZ*_*ero 30 c c++ int long-integer

正如我最近所了解的那样,C/C++中的长度与int的长度相同.简单地说,为什么?甚至在语言中包含数据类型似乎也毫无意义.它没有特定于int的特定用途吗?我知道我们可以像这样声明一个64位的int:

long long x = 0;
Run Code Online (Sandbox Code Playgroud)

但是为什么语言会选择这样做,而不仅仅是做得好......比int更长?其他语言如C#这样做,为什么不用C/C++呢?

Gri*_*wes 32

使用C或C++编写时,每种数据类型都是体系结构和编译器特定的.在一个系统int是32,但你可以找到它是16或64; 它没有定义,所以它取决于编译器.

至于longint,它来自时间,标准整数是16位,其中long是32位整数 - 它确实比...int.

  • @MGZero:你说得对,但是你没有完全阅读答案.在很长一段时间里,`int`和`short`在许多平台上都有相同的大小.如果`int`仍然是16位,那么这将是一个"传统"的东西.`int`基本上是指在你碰巧遇到的任何平台上为整数表示非常有效的大小. (6认同)
  • @Griwes,你暗示这是*过去*的事情,事实上,现在有很多平台,其中`long`和`int`是不同的大小,未来没有显示没有这种平台的迹象.您根本没有描述管理C类型大小的实际规则. (6认同)
  • @Mike:当我读到它时,他解释了当前形势的基本原理,这个理由必须在过去找到. (3认同)
  • +1 - 也可能值得一提的是,这就是为什么 c99 定义了 `uintNN_t` 等类型来澄清问题。 (2认同)
  • @MGZero,**完全没有**,这仍然因平台而异,并且_many_平台仍然定义了不同大小的`int`和`long`. (2认同)

Kei*_*son 31

具体保证如下:

  • char 是至少8位(根据定义,1字节,但它是多少位)
  • short 至少是16位
  • int 至少是16位
  • long 至少是32位
  • long long (在支持它的语言版本中)至少为64位
  • 上面列表中的每种类型至少与前一种类型一样宽(但可能相同).

因此,long如果您需要一个至少32位int的类型,如果您需要一个相当快且至少16位的类型,则使用它是有意义的.

事实上,至少在C,这些下界在来表示范围,而不是大小.例如,语言要求INT_MIN <= -32767,和INT_MAX >= +32767.16位要求遵循此要求,并且要求整数以二进制表示.

C99添加<stdint.h><inttypes.h>,它定义类型,例如uint32_t,int_least32_t,和int_fast16_t; 这些是typedef,通常定义为预定义类型的别名.

(在大小和范围之间不一定存在直接关系.一个实现可以产生int32位,但是只有一个范围,比如说,-2**23 .. +2^23-1其他8位(称为填充位)对该值没有贡献.理论上它是可能的(但实际上是极不可能的),其int可能是大于long,只要long有至少宽范围int.在实践中,一些现代的系统使用填充位,甚至比二进制补码等交涉,但标准仍允许这样的怪事你更有可能在嵌入式系统中遇到奇特的功能.)

  • @off99555 没有“默认数据类型”。如果您使用的实现可以保证“int”至少是 32 位,那么您可以放心地假设“int”至少是 32 位;所有符合 POSIX 的系统都这样做。如果您做出这样的假设,您的代码将无法移植到具有 16 位“int”的系统。这可能是也可能不是一个好的权衡。(与“政治正确”无关。) (2认同)

ars*_*enm 18

long与int的长度不同.根据规范,long至少与int一样大.例如,在带有GCC的Linux x86_64上,sizeof(long)= 8,sizeof(int)= 4.


Jon*_*Jon 13

long是不一样的大小int,这是至少相同的尺寸int.引用C++ 03标准(3.9.1-2):

有四种带符号的整数类型:"signed char","short int","int"和"long int".在此列表中,每种类型至少提供与列表中前面的存储一样多的存储空间.简单的int具有执行环境的体系结构所建议的自然大小); 提供其他有符号整数类型以满足特殊需求.

我对此的解释是"只是使用int,但如果由于某些原因不符合您的需求而您很幸运找到另一种更适合的整体类型,那就是我们的客人,而不是使用那个".一种long可能更好的方法是,如果你在一个更长的架构上.


小智 6

寻找完全不相关的东西,偶然发现了这个,需要回答。是的,这是旧的,所以对于以后上网的人......

坦率地说,我认为这里的所有答案都不完整。

long 的大小是您的处理器一次可以操作的位数的大小。它也被称为“词”。“半字”是短句。“双字”是 long long 是 long 的两倍(最初仅由供应商实现而不是标准),甚至比 long long 更大的是“quadword”,其大小是 long long 的两倍但它没有正式名称(也不是真正的标准名称)。

现在, int 从哪里进来?部分注册在您的处理器上,部分注册在您的操作系统上。您的寄存器定义了 CPU 处理的本机大小,而这些大小又定义了短和长等内容的大小。处理器还设计有数据大小,这是它操作的最有效大小。那应该是一个int。

在今天的 64 位机器上,您会假设,由于 long 是一个字,而 64 位机器上的一个字是 64 位,那么无论处理器设计用于处理什么,long 都是 64 位和 int,但它可能不是。为什么?您的操作系统已经选择了一个数据模型并为您定义了这些数据大小(很大程度上取决于它的构建方式)。最终,如果您使用的是 Windows(并使用 Win64),则 long 和 int 都是 32 位。Solaris 和 Linux 使用不同的定义(长为 64 位)。这些定义被称为 ILP64、LP64 和 LLP64 之类的东西。Windows 使用 LLP64,Solaris 和 Linux 使用 LP64:

型号 ILP64 LP64 LLP64
内部 64 32 32
长 64 64 32
指针 64 64 64
长长 64 64 64

其中,例如,ILP 表示 int-long-pointer,而 LLP 表示 long-long-pointer

为了解决这个问题,大多数编译器似乎支持直接使用 int32 或 int64 等类型设置整数的大小。

  • “* long 的大小是您的处理器一次可以操作的位数的大小。*”——标准没有说明或暗示这一点,而且并不总是正确的。在需要多条指令来操作 32 位数量的 16 位字的系统上,“long”仍然需要至少为 32 位。没有要求`short`是`long`宽度的一半,或者`long long`是`long`宽度的两倍——在我使用的系统(16位`short `、64 位 `long`、64 位 `long long`)。 (2认同)