在c ++或任何其他语言中,类型的大小与它们所采用的值范围之间的关系是什么? 例如,char的大小为1字节,表示没有。它可以存储的值是2 ^ 8。那么为什么它只能采用-128到127之间的值,为什么不是更大的值。 它与位模式有关吗? 或者我误解了这件事。我是编程的新手,我很快就掌握了这些概念,但是我坚持这个概念! 请解释一下浮点类型!提前致谢
答案 0 :(得分:4)
从状态数量的基本概念开始。有点有两种状态 - 0
和1
。两位有四种可能的状态:00
,01
,10
和11
。对于三位,状态数为8:
000 001 010 011 100 101 110 111
现在应该出现这种模式:添加一个额外的位可以使一组位可以采用的状态数加倍。这很容易看出:如果k
位的状态数是N
,那么对于k+1
位,有N
个状态,当添加的位是当0
或N
完全合并时,1
和N+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^8
是256
,其中
-128..127
有256
个值
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