关于有符号和无符号整数

  • 简介
  • 1. 运算规则
  • 2. 减法时注意
  • 3. 换算时
  • 4. 溢出问题
  • 5. 关于计算机是怎么区分二者


简介

有符号数就是取第一位二进制为符号位置0是代表整数,1是代表负数;
无符号整数则是全部二进制都代表相应的数据位;无符号数是从0开始的,没有负数;
如拿8位二进制来说:
1111 1111 无符号数的表示范围为0~255
而有符号数的表示范围是-128~127;

易错混淆:

1. 运算规则

在计算机内部整数都是以补码的形式储存的,有符号数和无符号数在计算机里表示都是一样的,二进制的补码形式。同时不管是无符号整数还是有符号整数的运算规则都是一样,得到的结果都是一样的,之所以运行输出的结果不一样,是因为编译器翻译的规则不一样,这也是由于因为二者的定义不一样。

2. 减法时注意

当做x-y的运算时,我们知道计算机内执行的是[x]补+[-y]补的运算,注意这里有一个混淆点,求[-y]补时,是将y的二进制全部取反后加一,而求负数的补码时是符号位不变将剩余位取法加一,笔者当时就是这里没注意然后就有点搞不清了,嘿嘿。

3. 换算时

二者转换也就很简单了,值是一样的,就根据二者的规则将结果算出来就行了,比如1100 1111当它为有符号整数时是换算成十进制是表示为-49,当为无符号整数时是表示207;

无符号整数转换为有符号整数lua 无符号整数是_c++


如上图代码,有符号整数下5-10=-5,-5在计算机内是以1111 1111 1111 1111 1111 1111 1111 1011的形式储存,对应无符号数就是4294967291。

4. 溢出问题

关于溢出,无符号数则是看进位标志位;
无符号数溢出判断:

其实很简单,就一句话:
       当最高为向更高位有进位(或借位)时产生溢出

有符号数则是溢出标志位;

Xf、Yf分别两个数的符号位,Zf为运算结果符号位。
	 	当Xf =Yf =0(两数同为正),而Zf=1(结果为负)时,负溢出;
		当出现Xf =Yf =1(两数同为负),而Zf=0(结果为正),正溢出.

5. 关于计算机是怎么区分二者

计算机也是根据一些标志位区分二者;就像前面的进位标志位类似;

最后啦啦啦
看到这里希望对你有所帮助