1.c/c++类型的一般大小
bool | char | short | int | long | float | double |
1 byte | 2 bytes | 4 bytes | 4 bytes | 4bytes | 8bytes |
2.数据的+/-计算
- a、加法
0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
+
1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
=
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
- b、负数的二进制表示
-7 由与+7相加得0可以推出:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
-
0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
=
1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
原因是-7和+7相加必然为0,对于计算机清零有一种手段,即为高位溢出。因此负数的二进制表示可以认为是对应正数各位取反,再+1。
3.长短类型之间赋值的处理
- 对于长短类型之间赋值,长类型赋值给短类型时,直接截断高位。即:
int
0000 | 0000 | 1000 | 0001 |
to
short
1000 | 0001 |
- 对于短类型赋值给长类型时,则会发生符号位扩展。如果有符号位的话:
char
1001 |
to
short
1111 | 1001 |
- 符号位则会扩展到前面的位中,以保证高位溢出各位清零的多米诺效应。
4.float类型二进制各位表示的协议
example.
int i =37;
float f = *(float*)&i;
当采用float类型解析int类型的数据时,二进制的各位将按照上图的规则进行解析计算:
-
0000 0000 0010 0101 xxxxxx=2^-3+2^-6+2^-8
(-1)^0 *1.xxxxxx*2^-127
- last
float j = 7.0;
short i = *(short*)&j;
=========
同理即为用short去解析float的各个二进制位。