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在内的很多编译器用的都是算术右移