字节大小(澄清)

时间:2011-05-27 08:35:41

标签: c++ byte

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

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

对于这种糟糕的解释感到抱歉,我并不擅长描述一个问题。

7 个答案:

答案 0 :(得分:30)

这触及了许多主题,包括字节的历史意义,字符的C定义和数学。

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

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

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

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

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

顺便提一下,ASCII是一个7位字符集。现在,具有7位字节的机器是不寻常的,并且像ISO 8859-1和UTF-8这样的更宽的字符集很受欢迎。

答案 1 :(得分:8)

0xFF可以存储为8位,即一个字节。

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

答案 2 :(得分:4)

  

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

char [无论是有符号还是无符号]的大小始终为1,符合C ++标准的要求。

答案 3 :(得分:1)

根据标准,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,所以该位用于增加范围。

答案 4 :(得分:0)

255,0xFF是一个字节,表示为unsigned char。您不能将255表示为签名字符。

答案 5 :(得分:0)

1个字节是8位,所以

  • 签名:( 1位用于签名,因此2 ^ 7 = 128)它从-128到127
  • 无符号:(2 ^ 8 = 255)它保持0到255

答案 6 :(得分:0)

char的大小始终为1,但是位数可以不同,C定义了具有字符位数的宏CHAR_BITunsigned char可以具有的平均最大值为pow(2, CHAR_BIT) - 1

更多信息在那里:What is CHAR_BIT?