字节大小(说明)
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..127
或 0..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 127
unsigned 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 个字节包含多少位取决于实现。以上是关于字节大小(说明)的主要内容,如果未能解决你的问题,请参考以下文章