作者目前就读于,双非本科,大一,很多地方理解不当还望各位大佬耐心教导。万分感谢!
本文为C语言的小事系列,喜欢的同志可以订阅本专栏点→这里这里,都是在下学习时总结的精华,希望对您有所帮助。
开门见山的说:
整数的二进制表示形式有原码,反码,补码这三种形式,而整数存储在内存中是存储的补码形式。
而且& | ^ 操作符也是通过操作补码实现的。
目录
整数二进制表现形式
此处演示的为32位处理器。
正数
原码就是一个整数的二进制形式
比如:3的原码
00000000000000000000000000000011
反码顾名思义就是原码反过来
符号为不变,其他位按位取反
正数的反码和补码,还有原码都是一样的。
3的反码↓↓↓
00000000000000000000000000000011
正数的补码和原码是一样的
3的补码↓↓↓
00000000000000000000000000000011
负数
比如:-3的原码
10000000000000000000000000000011
符号为不变,其他位按位取反
-3的反码↓↓↓
1111111111111111111111111111100
负数的补码和正数的不一样,为反码+1;
-3的补码↓↓↓
11111111111111111111111111111001
&操作符,按位与操作符
#include<stdio.h>
int main()
{
int a = 3;
int b = -5;
int c = a & b;
printf("%d", c);
return 0;
}
写出-5和3的补码
00000000000000000000000000000011-> 3的补码
11111111111111111111111111111011 -> -5的补码当你使用&时编译器就开始对补码进行操作了
开始按位有0则0,两边为1才为1
结果:00000000000000000000000000000011
不难看出这个数是3.
|操作符,按位或操作符
#include<stdio.h>
int main()
{
int a = 3;
int b = -5;
int c = a | b;
printf("%d", c);
return 0;
}
00000000000000000000000000000011-> 3的补码
11111111111111111111111111111011 -> -5的补码当你使用|时编译器就开始对补码进行操作了
开始按位有1则1,两边为0才为0
结果:11111111111111111111111111111011
不难看出这个数是5.
^操作符,按位异或操作符
#include<stdio.h>
int main()
{
int a = 3;
int b = -5;
int c = a ^ b;
printf("%d", c);
return 0;
}
00000000000000000000000000000011-> 3的补码
11111111111111111111111111111011 -> -5的补码当你使用^时编译器就开始对补码进行操作了
开始按位,相同的比特位为0,不同比特位为1;
相异为一,相同为零
结果:10000000000000000000000000001000
不难看出这个数是8.
右移操作符>>和<< 左移操作符
#include<stdio.h>
int main()
{
int a = 5;
int b = a << 1;
int c = a>> 1;
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}
00000000000000000000000000000101 -> 5的补码当你使用<<和>>时编译器就开始对补码进行操作了
<<整体向左移动一位,最左边一位舍去,最右边补一位0;
b结果:
算术右移:>>整体向右移动一位,最右边一位舍去,最左边补原符号位;
还有一种逻辑右移:最左边补0
c结果:
不难看出这两数是10和2.
哈,谢谢各位同志的阅读,然后呢如果觉得本文对您有所帮助的话,还给个免费的赞吧
Thanks♪(・ω・)ノ
(期待一下,要是有分享和收藏更好啦)