43-算术操作符、移位操作符

43-1 算数操作符

①除法操作符

整数的除法:1/2-->0

浮点型的除法:1.0/2-->0.5

                          1/2.0-->0.5

                          1.0/2.0-->0.5

注:想要进行浮点数的除法,至少要有一个是浮点数

②取模操作符

计算的是整除后的余数

注:取模两边的操作数必须是整数

int main()
{
	int a = 7 % 2;
	printf("%d\n", a);
	return 0;
}

结果:

43-2 移位操作符

移位操作符,移动的是二进制位,只针对整数

①二进制

数字的一种表现形式

二进制
0-1
八进制
0-7
十六进制
0-9 a-f
等等

整数的二进制表示有三种

原码、反码、补码

规定:

正整数的原码、反码、补码相同

负整数的原码、反码、补码是要计算的

十进制中的111:

1*10^0+1*10^1+1*10^2=111

二进制中的111:

1*2^0+1*2^1+1*2^2=7

整形是四个字节,一个字节8个比特位,一共32个比特位:

00000000000000000000000000000111  //原码

00000000000000000000000000000111  //反码

00000000000000000000000000000111  //补码

-7的二进制表示:

最高位为符号位:符号位为0,正数;符号位为1,负数

反码:除符号位,1变0,0变1

补码:反码+1

10000000000000000000000000000111  //原码

11111111111111111111111111111000  //反码(原码的符号位不变,其他位按位取反)

11111111111111111111111111111001  //补码(反码+1)

整数在内存中存储的是补码 

② 左移操作符

左边丢弃,右边补0

<<

正数左移,以7为例:

00000000000000000000000000000111  //补码

左移

00000000000000000000000000001110

0*2^0+1*2^1+1*2^2+1*2^3=14

代码: 

int main()
{
	int a = 7 ;
	int b = a << 1;
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

结果:

负数左移,以-7为例:

-7

10000000000000000000000000000111  //原码

11111111111111111111111111111000  //反码

11111111111111111111111111111001  //补码

11111111111111111111111111110010  //左移后的补码

11111111111111111111111111110001  //左移后的补码

10000000000000000000000000001110  //左移后的补码

-(0*2^0+1*2^1+1*2^2+1*2^3)=-14

代码:

int main()
{
	int a = -7;
	int b = a << 1;
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

结果:

通过观察,左移使7变成14,-7变成-14,有乘以2的效果 

③ 右移操作符

>>

算术移位

右边丢弃,左边补原符号位

逻辑移位

右边丢弃,左边补0

正数无论是算术移位,还是逻辑移位,结果都一样

代码:

int main()
{
	int a = 7;
	int b = a >> 1;
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

结果:

用负数可以测出来编译器用的是算术移位还是逻辑移位

以-7为例:

算术移位:

-7

10000000000000000000000000000111  //原码

11111111111111111111111111111000  //反码

11111111111111111111111111111001  //补码

11111111111111111111111111111100  //算数右移的补码

11111111111111111111111111111011  //算数右移的反码

10000000000000000000000000000100  //算数右移的原码

结果为-4

代码:

int main()
{
	int a = -7;
	int b = a >> 1;
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

结果:

逻辑移位:

-7

10000000000000000000000000000111  //原码

11111111111111111111111111111000  //反码

11111111111111111111111111111001  //补码

01111111111111111111111111111100  //算数右移的原码、反码、补码

包括VS在内的很多编译器用的都是算术右移

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值