【问题标题】:What is the difference when a variable holds less bits/bytes than another variable in c++ [closed]当一个变量比c ++中的另一个变量保存更少的位/字节时有什么区别[关闭]
【发布时间】:2020-10-19 01:35:19
【问题描述】:

在我用来学习 C++ 的 C++ 教程中,他们提到了 C++ 的数据类型。其中一些数据类型是 double 和 long double with float,long int、long long int 和 short int with int。它们的位不同,因为浮点数包含 32 位,双精度数包含 64 位,以此类推,长双精度数。 int 系列也会发生同样的事情。我的问题是位的作用是什么?具有更多位的变量和具有更少位的变量之间有什么区别?

【问题讨论】:

  • 把你的名字写在纸上。您需要一张 A4 纸还是一张小纸?
  • 他为什么会被否决?这是一个合理的问题。如果你不知道,问一个公平的问题。别再投票给他了。孩子 12 岁。
  • 一页纸太浪费纸,纸太少就写不出名字。对于内存和变量,它是相同的。你有几个“大小”的 int,你会在某个时候受到限制。
  • 你是什么意思@Delmak。
  • @Martheen:很公平。给孩子一些好的参考链接并结束问题?

标签: c++


【解决方案1】:

您的问题的答案有点长,因为这是一个基本问题(双关语)。

首先,计算机内部使用二进制系统(base 2)而不是您熟悉的十进制系统(base10)来表示信息。

一位是表示数字的二进制系统中的一个数字。在二进制中只有两个数字:1 和 0。所以每个数字都称为一个位。十进制有十位数字0,1,2,...,9;每一个都称为一个数字。碰巧在二进制中,一个数字有另一个名字,位。

我的问题是这些位到底有什么作用?

位只是数字。他们存储信息。就像如果在十进制中你可以有 4 位而不是 2 位;您最多可以用 4 位数数到 9,999,但最多只能用 2 位十进制数数到 99。因此,数字或位越多,您可以表示的数字就越多。也就是说,您可以存储的数据越多。

还有什么是比特和字节?

我已经解释了上面的内容。字节有点难以解释。在计算机世界中,我们有标准;非常长的文件,人们和公司花费大量时间考虑制定每个人都可以依赖的合理约定/协议。这样,如果我们都同意某些词语和概念的含义,就可以更容易地合作,因为我们都可以查看标准并以这种方式解决大多数争议/争论。这些标准每隔几年就会修订一次,但大部分内容会被添加,而很少有内容会被删除。

这样的标准之一是C standard;顺便说一句,还有一个C++ standard。 C 标准在第 3.6 节中说:

byte: addressable unit of data storage large enough to hold 
      any member of the basic character set of the execution environment

Note 2 to entry: A byte is composed of a contiguous sequence of bits, the 
                 number of which is implementation-defined. The least significant 
                 bit is called the low-order bit; the most significant
                 bit is called the high-order bit.

因此,“字节”的定义是实现定义的。这意味着它取决于您使用的系统。如上所述,在某些机器中它将是 8 位,而在其他机器中可能超过 8 位,但出于技术原因,对于 C 或 C++ 语言,它不能小于 8 位(参见下面的 cmets 以供参考)。由机器制造商决定。

但是,因为很早以前一些流行的计算机制造商将其定义为 8 位,所以今天大多数系统将一个字节定义为 8 位。这是另一个答案告诉你的。特别是,大多数现代计算机都基于将其定义为 8 位的 x86 架构。使用 ARM 的新机器也将其定义为 8 位,想想你的 iphone/ipad。因此,在实践中假设 8 位是安全的,尽管理论上它可以是任何东西。还有一些机器没有将一个字节定义为 8 位。

如果系统上的 long int 和 int 的位不同,long int 能做什么而 int 不能?

int                     -32767 to               +32767 representable in 16 bits
long               -2147483647 to          +2147483647 representable in 32 bits
long long -9223372036854775807 to +9223372036854775807 representable in 64 bits

ISO/IEC 9989:1999,第 5.2.4.2.1 段。 “它们的实现定义值的大小(绝对值)应等于或大于所示的值,符号相同。”

这直接来自 1999 年修订的 C 标准。如您所见,使用 long 比使用 int 可以计算更多;因此您可以使用 long 存储比 int 更多的数据。

现代系统对 int、long 和 long long 的定义与此稍有不同。要详细了解现代系统的实际定义和现代标准(最近的修订版),请参阅 "What's the difference between long long and long?"。

按照标准,所有可以保证的是:

  • int 必须至少为 16 位
  • long 必须至少为 32 位
  • long long 必须至少为 64 位

今天,如果您获得了用于 C 或 C++ 的 GNU/CLANG 编译器,并且没有在编译器中添加任何标志来更改标准,如果您获得一个 int 和一个 long,它们的长度可能都是 32 位。请注意,这符合标准; 32 位对于 int 来说至少是 16 位;而 32 位至少是 32 位。

【讨论】:

  • "它可能大于 8 或小于 8。" C 和 C++ 都要求每个字节至少 8 位,因此如果平台不能小于 8这些语言中的任何一种都支持。
  • @FrançoisAndrieux:这是哪个标准修订版?我还没有遇到过。
  • 从 C89 开始就是这样,从一开始就被 C++ 继承。见CHAR_BIT。
  • 我明白了。它实际上在上面提到的同一部分,在 C99 标准中它在 5.2.4.2.1 中。列表中的第一项。但是,踢球者在注释 4 部分“6.2.6.1 General”:“存储在任何其他对象类型的非位域对象中的值由 n×CHAR_BIT 位组成,其中 n 是该类型对象的大小,以字节为单位。”本质上在 C 中将一个字节定义为至少 8 位。事实上,脚注 40 证实了“一个字节包含 CHAR_BIT 位,并且 unsigned char 类型的值范围从 0 到 2^( CHAR_BIT ) − 1。”
  • @FrançoisAndrieux:已修复。谢谢!
猜你喜欢
  • 2015-02-12
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多