字节大小(说明)

Posted

技术标签:

【中文标题】字节大小(说明)【英文标题】:Size of byte (clarification) 【发布时间】:2011-05-27 08:35:41 【问题描述】:

我正在编写一个游戏服务器,这可能是一个简单的问题,但我只是想澄清一下。

为什么一个字节(char 或 unsigned char)可以容纳 255 的值(0xFF,我认为是 2 个字节)?当我使用 sizeof(unsigned char) 时,编译器告诉我它是 1 个字节。 是因为(在 ACSII 中)它正在“转换”为字符吗?

抱歉,我不太擅长描述问题。

【问题讨论】:

0xFF 是 2 位数字,而不是 2 个字节。一个字节是 0..2^8-1。 0xFF 是 2 个半字节... 1 个字节... 您将需要阅读有关数据类型大小和范围here 的信息。 char 可以是 8 位,也可以是 64 位;在任何情况下,“字节”都被定义为“字符”,因此一个字节可能超过 8 位。 一个字节不是 8 位。一个字节在标准中定义为char 的大小,不管是多少位。 ISO(和其他标准机构)倾向于使用术语八位字节来表示 8 位值。请参阅***.com/questions/1535131/… 了解更多信息。 【参考方案1】:

这涉及一系列主题,包括字节的历史意义、字符的 C 定义和数学。

对于初学者来说,一个字节历来是很多东西,但现在我们几乎总是指一个八位字节,即 8 位。作为文字游戏,还有半字节(不称为咬)的 nybble(或通常是 nibble)。

数学告诉我们,通过 8 个1-or-0 值的有序组合,我们得到2<sup>8</sup> = 256 组合。有时我们使用这个无符号的,有时是有符号的,但无论哪种方式,我们都希望范围内有 0;所以无符号范围是0..255。对于有符号范围,我们有more options,其中two's complement最受欢迎;在这种情况下,我们得到的负值比正值多一个,范围为-128..+127

C++ 继承自 C 的 char,其中它被定义为具有 1 的 sizeof,是最小的可寻址大小(即具有与 & 不同的地址值),以及 -128..1270..255 的最小范围取决于它是否签名。这归结为需要至少 8 位或一个字节;如果机器支持,则正好是一个字节。

0xff 是 255 的另一种写法。0x 是标记 hexadecimal 常量的 C 方式,因此其中的每个数字都是 4 位(16 个可能的数字),因此是半字节。这将转换为所有位都设置为 1 的无符号八位组。

如果特定大小对您的代码很重要,则有一个标头 stdint.h 定义最小和精确大小的类型,用于速度或大小优化。

顺便说一句,ASCII 是一个 7 位字符集。具有 7 位字节的机器如今已不常见,更广泛的字符集(如 ISO 8859-1 和 UTF-8)很受欢迎。

【讨论】:

【参考方案2】:

0xFF可以存储8位,也就是一个字节。

sizeof(char) 被定义为始终返回 1,而不管底层数据类型的实际位大小(参见当前标准的 5.3.3.1)。所有其他数据类型的大小都是相对于char 的大小计算的。

【讨论】:

【参考方案3】:

当我使用 sizeof(unsigned char) 时,编译器告诉我它是 1 个字节。

按照 C++ 标准的规定,char [无论是有符号还是无符号] 的大小始终为 1。

【讨论】:

【参考方案4】:

char 大小始终为1,但位数可能不同,C 定义宏CHAR_BIT,其位数为 char。 这意味着unsigned char 可以拥有的最大值是pow(2, CHAR_BIT) - 1

更多信息:What is CHAR_BIT?

【讨论】:

一个经常被忽视的边缘情况,需要注意。我在这个问题上与几个人进行了一场迂腐的争论。重要的是,cppreference 将“CHAR_BIT”称为 byte 中的位数【参考方案5】:

按照标准,char 或 unsigned char 的大小为 1 字节。

如果大小相同,为什么范围不同?

1 Byte = 8 bits or 2^8
2^8 = 256

因此,signed char 范围来自 -128 to 127unsigned char 范围来自 0 to 255

这是因为在signed char 的情况下,其中一位用于存储符号,而由于unsigned char 不能为-ve,则使用该位来增加范围。

【讨论】:

1 字节不一定是 8 位 - 它只是最常见的值【参考方案6】:

255, 0xFF 在表示为无符号字符时是一个字节。您不能将 255 表示为带符号的字符。

【讨论】:

是的,有符号字节的范围是-128..127【参考方案7】:

1 字节是 8 位所以在这种情况下

有符号:(1 位用于符号,因此 2^7 = 128)它的范围为 -128 到 127 unsigned : (2^8 = 255) 它的范围是 0 到 255

【讨论】:

1 个八位字节包含 8 位。 1 个字节包含多少位取决于实现。

以上是关于字节大小(说明)的主要内容,如果未能解决你的问题,请参考以下文章

内核调优参数说明

Linux内核调优部分参数说明

注意:“无符号”说明符会更改 Visual Studio 中 wchar_t 类型的大小

MySQL 的最佳 varchar 大小是多少?

sizeof()计算结构体的大小

基础命令说明