二进制详解

一、原码,反码,补码

在 C 语言里数据类型有 有符号数无符号数 之分。

只有有符号数才有原码,反码,补码的概念,因为有符号数的最高位表示正负。

而无符号数不管怎么样都是表示正数,所以它的原码,反码,补码都是一样。

在计算机中为了计算方便,所有数据都是以补码的形式存储的。

因为这样减法运算也可以按照加法来运算,这就很巧妙了。

举个例子:0,-0,21.65625,-21.65625的原码,反码,补码分别是多少?

(所有的数据类型都可以这样运算,为了方便,这里仅展示计算方式,不涉及相关数据大小)

十进制数原码反码补码
00000 0000 0000 00000000 0000 0000 00000000 0000 0000 0000
-01000 0000 0000 00001111 1111 1111 11110000 0000 0000 0000
180000 0000 0001 00100000 0000 0001 00100000 0000 0001 0010
-181000 0000 0001 00101111 1111 1110 11011111 1111 1110 1110
21.656250001 0101.1010 10000001 0101.1010 10000001 0101.1010 1000
-21.656251001 0101.1010 10001110 1010.0101 01111110 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.751.1*2^-100111 111010011 1111 0100 0000 0000 0000 0000 00003F 40 00 00
-0.75-1.1*2^-110111 111011011 1111 0100 0000 0000 0000 0000 0000BF 40 00 00
1.51.1*2^000111 111110011 1111 1100 0000 0000 0000 0000 00003F C0 00 00
-1.5-1.1*2^010111 111111011 1111 1100 0000 0000 0000 0000 0000BF C0 00 00
3.01.1*2^101000 000010100 0000 0100 0000 0000 0000 0000 000040 40 00 00
-3.0-1.1*2^111000 000011100 0000 0100 0000 0000 0000 0000 0000C0 40 00 00
5.6251.01101*2^201000 0001011010100 0000 1011 0100 0000 0000 0000 000040 B4 00 00
-5.625-1.01101*2^211000 0001011011100 0000 1011 0100 0000 0000 0000 0000C0 B4 00 00

  

三、逻辑运算

逻辑运算符名称说明
<<左移左移n位代表乘2^n
>>右移右移n位代表除2^n
|位或即全为0则为0
&位与即全为1则为1
~位非即 ~1 得 0,~0 得 1
^位异或即相同为 0,不同为 1

转载于:https://www.cnblogs.com/M-Anonymous/p/9615364.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值