取值范围

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

 

posted @ 2021-08-13 09:00  好想成为一只鸟  阅读(346)  评论(0)    收藏  举报