如何存储数字?

时间:2014-01-16 10:52:24

标签: c++

编译器用什么方法存储数字?一个字符是0-255。两个字符并排是0-255255。在c ++中,一个short是2个字节。大小为0-65535。现在,编译器如何将255255转换为65535以及 - 在无符号数字中会发生什么?

5 个答案:

答案 0 :(得分:4)

可以存储在n位中的最大值(当最低值为0且表示的值为连续范围时)为2ⁿ - 1.对于8位,这给出255.对于16位,这给出65535。

你的错误在于你可以将255和255连接起来以获得两个char中的最大值 - 这绝对是错误的。相反,要从8位的范围(256位)到16位的范围,你可以做256×256 = 65536.由于我们的第一个值是0,最大值是65535,再一次。

请注意,char仅保证至少 8位且short至少为16位(并且必须至少与{{{1}一样大1}})。

答案 1 :(得分:2)

使用十进制时,一位数的范围是0-9,两位数的范围是0-99。使用十六进制系统时同样适用,但您必须在十六进制系统中进行数学运算。一个十六进制数字的范围是0-Fh,两个十六进制数字(一个字节)的范围是0-FFh。两个字节的范围是0-FFFFh,这在十进制系统中转换为0-65535。

答案 2 :(得分:2)

十进制是一个基数为10的数字系统。这意味着从右到左的每个连续数字代表10的增量功率。例如,1233 + (2*10) + (1*100)。你可能不会在日常生活中用这些术语来思考它,但这就是它的工作原理。

现在你从十进制(基数为10)到二进制(基数为2)采用相同的概念,现在每个连续的数字是2的幂,而不是10.所以11000 + (0*2) + (1*4) + (1*8)

现在让我们取一个8位数字(char);此数字中有8位数字,因此最大值为255 (2**8 - 1),或其他方式,11111111 == 1 + (1*2) + (1*4) + (1*8) + (1*16) + (1*32) + (1*64) + (1*128)

当有另外8位可用于产生16位值时,您只需继续计数2的幂;你不要只是将两个255“粘在一起”来制作255255。因此,最大值为65535,或其他方式,1111111111111111 == 1 + (1*2) + (1*4) + (1*8) + (1*16) + (1*32) + (1*64) + (1*128) + (1*256) + (1*512) + (1*1024) + (1*2048) + (1*4096) + (1*8192) + (1*16384) + (1*32768)

答案 3 :(得分:2)

你的数学完全错了。这是真正的

由于每个位只能处于两个状态中的任何一个(1和0),因此n个位总体上可以表示2 ^ n个不同的 数量 而不是数字。处理整数时,标准的2个字节的短整数大小可以表示2 ^ n - 1(n = 16,即65535),为了简化计算,它们在现实生活中被映射到十进制数。
当处理2个字符时,它们是两个单独的实体(字符串是一个字符数组)。有很多方法可以读取整个两个字符,如果你读的是一个字符串,那么它将与两个单独的字符并排相同。让我举个例子:
记得我将使用十六进制表示法来简化!
如果您怀疑将ASCII字符映射到十六进制,请查看此ascii to hex

为简单起见,我们假设存储在两个相邻位置的字符都是A.
现在A的十六进制代码是0x41,所以内存看起来像是

1个字节.......第2个字节
01000100 01000001

如果您从内存中读取此字符串并将其打印出来,则输出将为
AA

如果您要将整个2个字节作为整数读取,那么这将代表

0 * 2 ^ 15 + 1 * 2 ^ 14 + 0 * 2 ^ 13 + 0 * 2 ^ 12 + 0 * 2 ^ 11 + 1 * 2 ^ 10 + 0 * 2 ^ 9 + 0 * 2 ^ 8 + 0 * 2 ^ 7 + 1 * 2 ^ 6 + 0 * 2 ^ 5 + 0 * 2 ^ 4 + 0 * 2 ^ 3 + 0 * 2 ^ 2 + 0 * 2 ^ 1 + 1 * 2 ^ 0

  

= 17537

如果使用无符号整数,则我将2字节数据映射到其间的整数 0和65535但如果相同表示有符号值然后,虽然范围保持不变,但可以表示的最大正数将是32767.值将介于-32768和32767之间,这是因为所有2个字节都不能使用并留下最高位以确定符号。 1代表负数,2代表正数。

您还必须注意,类型转换(两个字符读取为单个整数)可能并不总能为您提供所需的结果,尤其是在缩小范围时。 (例如,将doble精度浮点数转换为整数。)



有关详情,请参阅此答案double to int
希望这有帮助。

答案 4 :(得分:1)

取决于类型:整数类型必须存储为二进制 (或者至少对C ++程序来说是这样),所以你有一点 每个二进制数字。除了极少数例外,所有的比特都是 显着(虽然这不是必需的,并且有 至少一台机器,int中有额外的位。上 典型的机器,char将是8位,如果不是 已签名,可以存储[0,2^8)范围内的值;换一种说法, 介于0和255之间。 unsigned short将是16位 (范围[0,2^16)),unsigned int 32位(范围[0,2^32)) 和unsigned long 32位或64位。

对于签名值,您必须至少使用其中一个 符号的位,减少最大正值。该 负值的精确表示可以变化,但在大多数情况下 机器,它将是2的补码,因此范围将是 signed char: [ - 2 ^ 7,2 ^ 7-1)`等等。

如果你不熟悉二号基础,我建议你学习它 很快;它是所有现代机器存储的基础 数字。你应该找到大约2的补码: 通常的人类表征称为符号加幅度,并且是 在计算机中非常罕见。