C语言-位运算符

文章讨论了整数在内存中的补码表示,以及正数和负数的原码、反码和补码之间的关系。通过示例解释了正数和负数左移一位后的二进制变化,展示如何计算新值。
#include <stdio.h>

/*
	
	整数在内存中存储的是补码
	 
	整数的二进制表示有3中(原反补码)
	原码  反码  补码


	正数的原反补码相同
	负数的原反补码需要计算

	7(十进制)
	00000000 00000000 00000000 00000111  原码
	00000000 00000000 00000000 00000111  反码
	00000000 00000000 00000000 00000111  补码

	-7(十进制)
	10000000 00000000 00000000 00000111  原码(负数最高位为1)
	11111111 11111111 11111111 11111000  反码(原码最高位1不变,其他位取反,得到反码)
	11111111 11111111 11111111 11111001  补码(反码+1,得到补码)

*/


int main() {
	/*
	正整数(7)左移一位
	00000000 00000000 00000000 00000111  补码(在内存中存储的二进制数,正整数的原反补码相同)
	00000000 00000000 00000000 00001110  左移一位时,最前面一位去掉,后面补0。此时得到的是新的补码
										 但由于正整数原反补码相同,所以这就是原码,对应十进制数是14
	
	*/

	int a = 7; 
	int b = a << 1;
	printf("%d\n", b); //左移1位后原码  0......0000 1110     8+4+2=14
	printf("%d\n", a);//a不变  7


	/*
	负整数(-7)左移一位
	11111111 11111111 11111111 11111001  补码
	11111111 11111111 11111111 11110010	 左移一位时,最前面一位去掉,后面补0,得到新的补码
	11111111 11111111 11111111 11110001  反码(补码-1,得到反码)
	10000000 00000000 00000000 00001110	 原码(符号位不变,其他位取反,得到原码,对应十进制数是-14)
	*/

	int c = -7; 
	int d = c << 1;
	printf("%d\n", d); //左移1位后原码  1......0000 1110     -(8+4+2) = -14
	printf("%d\n", c);//c不变 -7

	return 0;
}

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值