类型大小与其价值范围之间的关系?

时间:2017-08-13 12:04:55

标签: c++ types floating-point byte

在c ++或任何其他语言中,类型的大小与它们所采用的值范围之间的关系是什么? 例如,char的大小为1字节,表示没有。它可以存储的值是2 ^ 8。那么为什么它只能采用-128到127之间的值,为什么不是更大的值。 它与位模式有关吗? 或者我误解了这件事。我是编程的新手,我很快就掌握了这些概念,但是我坚持这个概念! 请解释一下浮点类型!提前致谢

2 个答案:

答案 0 :(得分:4)

从状态数量的基本概念开始。有点有两种状态 - 01。两位有四种可能的状态:00011011。对于三位,状态数为8:

000 001 010 011 100 101 110 111

现在应该出现这种模式:添加一个额外的位可以使一组位可以采用的状态数加倍。这很容易看出:如果k位的状态数是N,那么对于k+1位,有N个状态,当添加的位是当0N完全合并时,1N+N个州会有更多状态。因此,k位可以有2个 k 状态。

字节是8位的组,因此一个字节可以具有的状态数是2 k ,即256.如果使用字节表示无符号值,则其范围将为0 .255,包括在内对于有符号值,一位用于表示符号。在two's complement representation中,值范围变为-128..127。负值允许一个额外值,因为范围的非负部分包括零,而范围的负部分不具有零。

答案 1 :(得分:3)

其简单,可变的数据类型具有2^(sizeof(datatype) * CHAR_BIT)个值。现在,这取决于此数据类型是signed还是unsigned

signed的值为0 .. ((2^(sizeof(datatype) * CHAR_BIT))-1)

unsigned的值为-((2^(sizeof(datatype) * CHAR_BIT))/2) .. +((2^(sizeof(datatype) * CHAR_BIT)/2)-1)

char 数据类型

2^8256

,其中

-128..127256个值

signed char

unsigned char的范围

0..255,仍为256值。

字节是8位的序列。

+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+---+---+---+
 2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0

最高位(以小位端为单位)表示值是0 - positive还是1 - negative,其余位是值。

然后你有

+---+---+---+---+---+---+---+---+
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |    < Max positive number
+---+---+---+---+---+---+---+---+
 2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0

+---+---+---+---+---+---+---+---+
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |    < Max negative number
+---+---+---+---+---+---+---+---+
 2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0

零的因数通常用two's complement表示。

来自两个补码的转换是

1. Invert all bits -> |0|1|1|1|1|1|1|1| ->  127
2. Add 1           -> |1|0|0|0|0|0|0|0| ->  128
3. Change sign     ->                   -> -128