取值范围
CPU能读懂的最小单位——比特位,bit,b
内存机构的最小寻址单位——字节,Byte,B
一字节=8bit
每个比特位只能存放二进制数,也就是只能存放0或1
一个字节可以表示最大的数(二进制):11111111
二进制:0 1
十进制:0 1 2 3 4 5 6 7 8 9
十六进制:0 1 2 3 4 5 6 7 8 9 A B C D E F
怎么用比特位算十进制:2的n次方减1
说人话就是,上边的二进制数 0010 1010 转换成十进制数就是:
0 * 2^7 + 0 * 2^6 + 1 * 2^5 + 0 * 2^4 + 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0
== 0 * 128 + 0 * 64 + 1 * 32 + 0 * 16 + 1 * 8 + 0 * 4 + 1 * 2 + 0 * 1
== 42
“按权相加”的方法适用于任何进制数到十进制数的转换。
二进制(补码)-> 十进制
上边的转换是对于无符号数来说的,如果万一摊上一有符号数,那转换就不是这么简单了……
当然,也不是那么复杂!
对于有符号数(补码)来说:
如果符号位为 0,表示该数为正数,转换跟无符号数没什么两样。
如果符号位为 1,表示该数为负数,此时符号位的位权不变,但该位的权值应该乘以 -1 得到。
举个栗子,将有符号数 0011 1100 转换成十进制数,与无符号数的做法是一样的:
0 * 2^7 + 0 * 2^6 + 1 * 2^5 + 1 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 0 * 2^0
== 32 + 16 + 8 + 4
== 60
然后如果符号位为 1,表示这是一个负数,比如 1011 1100,那么符号位的权值就应该乘以 -1 得到:
-1 * 2^7 + 0 * 2^6 + 1 * 2^5 + 1 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 0 * 2^0
== -128 + 32 + 16 + 8 + 4
== -68
在举个极端点的例子,比如 1000 0000:
-1 * 2^7 + 0 * 2^6 + 0 * 2^5 + 0 * 2^4 + 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 0 * 2^0
== -128
现在明白为啥 1000 0000 表示 -128 了吧~
#include <stdio.h>
#include <math.h>
int main()
{
unsigned result=pow(2,32)-1;
printf("result=%u\n",result);
return 0;
}
2的32次方减一=4294967295
一个32位的整形变量,除去左边第一位符号位,剩下表示值的只有31个比特位。
补码:
..正数的补码是该数的二进制形式。
..负数的补码:
1.先取得该数的绝对值的二进制形式
2.再将第一步的值按位取反(0变1,1变0)
3.最后将第二步取得的值加1
例如:
7 00000111
10000111
-7 11111000
11111001
8个比特位最大值01111111(127)
最小值10000000(-128)
负数多一位是因为正数还有0
浙公网安备 33010602011771号