一、原码,反码,补码
在 C 语言里数据类型有 有符号数 和 无符号数 之分。
只有有符号数才有原码,反码,补码的概念,因为有符号数的最高位表示正负。
而无符号数不管怎么样都是表示正数,所以它的原码,反码,补码都是一样。
在计算机中为了计算方便,所有数据都是以补码的形式存储的。
因为这样减法运算也可以按照加法来运算,这就很巧妙了。
举个例子:0,-0,21.65625,-21.65625的原码,反码,补码分别是多少?
(所有的数据类型都可以这样运算,为了方便,这里仅展示计算方式,不涉及相关数据大小)
十进制数 | 原码 | 反码 | 补码 |
0 | 0000 0000 0000 0000 | 0000 0000 0000 0000 | 0000 0000 0000 0000 |
-0 | 1000 0000 0000 0000 | 1111 1111 1111 1111 | 0000 0000 0000 0000 |
18 | 0000 0000 0001 0010 | 0000 0000 0001 0010 | 0000 0000 0001 0010 |
-18 | 1000 0000 0001 0010 | 1111 1111 1110 1101 | 1111 1111 1110 1110 |
21.65625 | 0001 0101.1010 1000 | 0001 0101.1010 1000 | 0001 0101.1010 1000 |
-21.65625 | 1001 0101.1010 1000 | 1110 1010.0101 0111 | 1110 1010.0101 1000 |
(从这个表中可以清楚的看到所有的加减法运算都可以用加法来进行运算)
原码,反码,补码的运算方式:
1、正数的原码,反码,补码 都一样。
2、负数的原码在正数的原码基础上,将正数的最高位改为 1。
负数的反码在负数的原码基础上,除最高位不变外,其他位都取反。
负数的补码在负数的反码基础上,将反码的最后一位加 1。
二、符号位,阶码,尾数
在计算机内部实数都是以 (符号位-阶码-尾数) 的形式表示的。
一个 float 型实数在内存中占 4byte,即 32bit。
从低位到高位依次叫 第0位 到 第31位。这 32位 可以分成 3个部分:
1、符号位(第31位) --- 0表示正数,1表示负数。
2、阶码(第30位 到 第 23位) ---
这8个二进制位表示该实数转化为规格后的二进制实数后的指数与127之和(即所谓的阶码)。(127即所谓的偏移量)
规格化后的二进制实数的指数只能在 -127 到 +127 之间。
3、尾数(余下的23位) --- 即小数点后的23位。
double 类型:(8byte,即 64bit)
1、符号位(第31位) --- 0表示正数,1表示负数。
2、阶码(第30位 到 第20位)。规格化后的二进制实数的指数只能在 -1023 到 +1023 之间。
3、尾数(余下的52位) --- 即小数点后的52位。
举个例子(float类型):1.5,-1.5 符号位,阶码,尾数,及在计算机内存中的表示(16进制)
十进制数 | 二进制实数 | 符号位 | 阶码 | 尾数 | 内存中的表示(2进制) | 内存中的表示(16进制) |
0.75 | 1.1*2^-1 | 0 | 0111 1110 | 1 | 0011 1111 0100 0000 0000 0000 0000 0000 | 3F 40 00 00 |
-0.75 | -1.1*2^-1 | 1 | 0111 1110 | 1 | 1011 1111 0100 0000 0000 0000 0000 0000 | BF 40 00 00 |
1.5 | 1.1*2^0 | 0 | 0111 1111 | 1 | 0011 1111 1100 0000 0000 0000 0000 0000 | 3F C0 00 00 |
-1.5 | -1.1*2^0 | 1 | 0111 1111 | 1 | 1011 1111 1100 0000 0000 0000 0000 0000 | BF C0 00 00 |
3.0 | 1.1*2^1 | 0 | 1000 0000 | 1 | 0100 0000 0100 0000 0000 0000 0000 0000 | 40 40 00 00 |
-3.0 | -1.1*2^1 | 1 | 1000 0000 | 1 | 1100 0000 0100 0000 0000 0000 0000 0000 | C0 40 00 00 |
5.625 | 1.01101*2^2 | 0 | 1000 0001 | 01101 | 0100 0000 1011 0100 0000 0000 0000 0000 | 40 B4 00 00 |
-5.625 | -1.01101*2^2 | 1 | 1000 0001 | 01101 | 1100 0000 1011 0100 0000 0000 0000 0000 | C0 B4 00 00 |
三、逻辑运算
逻辑运算符 | 名称 | 说明 |
<< | 左移 | 左移n位代表乘2^n |
>> | 右移 | 右移n位代表除2^n |
| | 位或 | 即全为0则为0 |
& | 位与 | 即全为1则为1 |
~ | 位非 | 即 ~1 得 0,~0 得 1 |
^ | 位异或 | 即相同为 0,不同为 1 |