C语言补码运算符怎么使用,C语言基础(八)- 进制转化、计算机补码、位运算符...

进制转化

一个数字的大小本质上都是表示状态数的多少

数字的表示可以用不同的进制

十进制转r进制:整数部分–除r取余,直至商0,余数倒置即可,小数部分–乘r取整,直至积为0,整数正序排列即可

二进制转10进制:8421码

补码的相关知识

在介绍补码之前先来认识其他的一些二进制码:

1、原码:

也叫符号—绝对值码,最高位0表示正、1表示负,其余二进制是该数字的绝对值的二进制位

如-5的原码是10101, 原码简单易懂,但是它加减复杂,存在加减乘除四种运算,增加了CPU的复杂度

还有就是源码制下0的表示不唯一,所以源码在计算机中从来不使用。

2、反码:

对原码每一位取反,在计算机中基本无使用

3、移码:

表示数值平移n位,(n称为移码量),移码主要用于浮点数阶码的存储

以上为认识补码的相关背景知识。

那么什么是补码呢?为什么要引入补码?

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

补码的特性:

一个整数的原码与其补码相加,和为模

对一个整数的补码再求补码,等于该整数自身

补码的正零与负零表示方法相同

通过源码求补码:

[+73]补 = 01001001

[-73]补 = 100000000 - 01001001 = 10110111

[+1]补 = 00000001

[-1]补 = 100000000 - 00000001 = 11111111

[+127] = 01111111

[-127] = 100000000 - 01111111 = 10000001

综上:

1. 整数的补码与其原码相同

2. 0的补码仍然为0

3. 负数的补码可以通过其正数的原码“取反加一”,并且最高符号位也参与运算得到

扩展:

根据补码的定义,可以证明:

[X]补 + [Y]补 = [X+Y]补

[X]补 - [Y]补 = [X-Y]补

这表明,两个补码加减的结果也是补码,而且在运算时,符号位可同数值部分作为一个整体参加运算,如果符号位有进位则舍弃进位。

计算机中的加减运算:

如:4-6=?

0000 0100

+ 0000 0110-->1111 1001-->1111 1010

-----------------------------------

1111 1110 (所得结果为补码,符号位为负)-->0000 0001-->0000 0010

故最终结果为 -2

[注] 一个数的补码为(1111 1110),求其数值?

分析:最高位为1,则该数肯定为负数,并且我们知道“补码的补码就是其对应的非负数值”,求得0000 0010,

故这个数的数值为 -2。

程序演示:

/**

* 计算机二进制运算程序演示

*/

# include

int main() {

int a = 0;

short int i = -3;

int j = -3;

long int k = -3;

char m = 'A';

int n = 0XFFFFFFE1; //11111111111111111111111111100001 //负数最高符号位均补1

printf("%#X\n",a); //0

printf("%#X\n",i); //0XFFFFFFFD

printf("%#X\n",j); //0XFFFFFFFD

printf("%#X\n",k); //0XFFFFFFFD

printf("%#X\n",m); //0X41

printf("%d\n",n); //-31

return 0;

}

常见的位运算符

按位与&

按位或|

按位取反\~

按位异或^

按位左移和按位右移 \<< >>

/*

5&7=5

5&-7=1

5|7=7

5|-7=-3

~5=-6

~7=6

5^7=2

5^-7=-4

5<<1=10

-7<<1=-14

5>>1=2

-7>>1=-4

*/

# include

int main() {

printf("5&7=%d\n", 5&7); //5的二进制补码是...0101,7的二进制补码是...0111,两者相与后补码变为...0101,输出十进制结果为5

printf("5&-7=%d\n", 5&-7); //5的二进制补码为00000101,-7的二进制补码为11111001,5&-7=00000001,即输出结果为1

printf("5|7=%d\n", 5|7); //5的二进制补码为00000101,7的二进制补码为00000111,5|7=00000111,即输出结果为7

printf("5|-7=%d\n", 5|-7); //5的二进制补码为00000101,-7的二进制补码为11111001,5|-7=,结果的补码为11111101,是个负数,结果为-3

printf("~5=%d\n", ~5); //5的二进制补码为00000101,则~5=11111010,是个负数,结果为-6

printf("~7=%d\n", ~-7); //-7的二进制补码为11111001,则~-7=00000110,结果为6

printf("5^7=%d\n", 5^7); //5的二进制补码为00000101,7的二进制补码为00000111,5^7=00000010,结果为2

printf("5^-7=%d\n", 5^-7); //5的二进制补码为00000101,-7的二进制补码为11111001,5^-7=111111100,结果为-4

printf("5<<1=%d\n", 5<<1); //5的二进制补码为00000101,5<<1=00001010,结果为10

printf("-7<<1=%d\n", -7<<1); //-7的二进制补码为11111001,-7<<1=11110010,结果为-14

printf("5>>1=%d\n", 5>>1); //5的二进制补码为00000101,5>>1=00000010,结果为2

printf("-7>>1=%d\n", -7>>1); //-7的二进制补码为11111001,-7>>1=11111100,结果为-4

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值