我正在编写游戏服务器,这可能是一个简单的问题,但我只想澄清一下。
为什么字节(char或unsigned char)最多可以容纳255(0xFF,我认为是2字节)?当我使用sizeof(unsigned char)
时,编译器告诉我它是1个字节。
是因为(在ACSII中)它被“转换”为一个角色吗?
对于这种糟糕的解释感到抱歉,我并不擅长描述一个问题。
答案 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位,所以
答案 6 :(得分:0)
char
的大小始终为1
,但是位数可以不同,C定义了具有字符位数的宏CHAR_BIT
。
unsigned char
可以具有的平均最大值为pow(2, CHAR_BIT) - 1
。
更多信息在那里:What is CHAR_BIT?