您的问题的答案有点长,因为这是一个基本问题(双关语)。
首先,计算机内部使用二进制系统(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 位。