获取中...

-

Just a minute...

机器语言

最初的计算机使用的是又”0”和”1”组成的二进制数,二进制是计算机语言的基础,将一串二进制数字转换为高低电平,驱动计算机运行。在计算机中,所有的数据都能使用二进制数表达。

例如

0000 0000(二进制数)表示0(十进制数)
0000 0001(二进制数)表示1(十进制数)
0000 0111(二进制数)表示7(十进制数)
1111 1111(二进制数)表示255(十进制数)
我们可以轻松的用二进制表示一个正数,但负数如何用计算机表达呢?这就需要知道原码,补码和反码。其实数分为有符号数和无符号数,原码,反码和补码都是有有符号数的表示方法,在计算机中,负值以其正值的补码形式表达,正数的原码,补码和反码都为他本身

原码

一个整数,按照绝对值大小转换成二进制数为原码,原码的最高位为符号位,”0”表示正,’’1”表示负,其余位表示数值大小。

例如

1的原码为0000 0001

-1的原码为1000 0001

反码

将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

取反(’’1’’变为’’0’’,’’0’’变为’’1’’)

例如

0000 0101取反为1111 1010

0000 0011取反为1111 1100

正数取反

10的原码是0000 1010 ,取反是1111 0101,即-11

5的原码是0000 0101,取反是1111 1010,即-6

负数取反

-10的二进制是1111 0110,取反是0000 1001,即9

-5的二进制是1111 1011,取反是0000 0100,即4

由此观之,正整数按位取反等于其负数减1。负整数按位取反等于其正数减1

补码

负数的补码是相对应的正数取反加1
在计算机系统中,数值一律用补码来表示和储存。使用补码,可以将符号位和数据域统一处理,减法也可以按加法处理,码表示的数相加时,如果最高位有进位,则进位被舍弃。

比如数学上的1+(-1)=0

二进制则为0000 0001+1000 0001=1000 0010(十进制为-2),显然出错了

用补码则为0000 0001+1111 1111=0000 0000(十进制为0)

八位二进制数的表示范围

1
2
3
4
5
6
7
8
#include<stdio.h>
int main()
{
char a;
scanf("%d",&a);
printf("%d",a);
return 0;
}

执行这段代码,当输入0~127时,输出的值和输入的值相等

当输入128时,结果为-128

输入129时,结果为-127

输入130时,结果为-126

……

……

输入254时,结果为-2

输入255时,结果为-1

输入256 ~ 383时,结果为0 ~ 127

输入384 ~ 511时,结果为-128 ~ -1

当输入512时,结果又回到了0

这个结果就像在一个范围为-128 ~ 127的圆上不断的循环,这就相当一个’’模’’,’’模’’是一个计量系统的计数范围,例如一个时钟的计量范围为0 ~ 11,模为12。表示n位的计算机的计量范围为0 ~2的n次方减1,模为2的n次方。当n为8时,不讨论进制位,所能表示的最大数为1111 1111,若加1,则为1 0000 0000,因为只有8位,最高位1舍弃,结果为0000 0000,所以八位二进制的模为2的九次方。

关于 补码=反码+1

一个负数如-8,可以看做0-8,即0000 0000-0000 1000,即1 0000 0000-0000 1000=1111 1000,可以看作用模数减一个数,可以得到这个数的补数,也可以看做这个数的反数加1。

在八位二进制中,补码的范围是0000 0000~0111 1111,即0 ~ 127

负数的补码范围是相应正数0000 0000到0111 1111取反加1

得到补码1 0000 0000到1000 1001,1000 1001的原码是1111 1111(-127),-1的补码为1111 1111,补码0000 0000的原码为1000 0000,即-128

则127(0111 1111)+1(0000 0001)= -128(1000 0000)

所以八位二进制数表示的范围为 -128~127

0000 0000 到 0111 1111 即 0到127

-1000 0000 到1111 1111 即 -128到-1

相关文章
评论
分享
  • Alloc to Stack&Arbitary Alloc

    Alloc to Stack和Arbitary Alloc都利用了fastbin链表的特性。 Alloc To Stack利用了fastbin链表的特性。当前的chunk的fd指向下一个chunk。Alloc To Stack核心...

    Alloc to Stack&Arbitary Alloc
  • House of Spirit

    House of Spirit针对fastbin,也是fastbin attach的一种。核心在于在目标位置处伪造 fastbin chunk,并将其释放,从而达到分配指定地址的 chunk 的目的。 原理House of Spi...

    House of Spirit
  • Fastbin Double Free

    double free 是任意地址写的一种技巧,指堆上的某块内存被释放后,并没有将指向该堆块的指针清零,那么,我们就可以利用程序的其他部分对该内存进行再次的free, 利用条件Fastbin Double Free 能够成功利用主...

    Fastbin Double Free
Please check the parameter of comment in config.yml of hexo-theme-Annie!