目录
先介绍整数在内存中的存储方式
一.整数在内存中的存储方式
数子的表示方法主要有原码,补码,反码三种,在内存中的存储形式为其补码形式,均以二进制形式表示
1.原码,补码,反码
a.首先是源码:对于整数来说,原码即为其二进制形式,例如:十进制5的原码为101,又因为一个整型在内存中占4个字节,32个比特位,因此数字5在内存中的存储应为00000000000000000000000000000101,十进制数字-5应表示为10000000000000000000000000000101.注意,32比特位首位又称符号位,规定正数首位为0,负数为1.
b.其次是反码:对于正整数来说,补码,源码,反码是相同的。对于负数来说,其在内存中以其源码的补码存放。下面介绍原码-->反码的转换:对于正数,补码原码反码相同;对于负数,可先写出其原码,然后对位取反,符号位不变即可,例如十进制-5原码转换为反码后为11111111111111111111111111111010.
c.最后是补码:同样对于正整数来说,补码,源码,反码是相同的,不在解释。对于负数来说,补码=反码+1,例如,对于数字-5来说,其补码为11111111111111111111111111111011.
2.注意事项
对于正整数来说,补码,源码,反码是相同的***
二.操作符
1.左移操作符
左移操作符:<<
规则:正数二进制左移1 ,负数补码左移一,符号位不变,右端空位补零
左移是指将二进制位向左移动一位同时最后空出来的一位补零。下面以实例演示:例如,十进制数字5,二进制为00000000000000000000000000000101,现左移一位,即变成00000000000000000000000000001010,转换成二进制数字应为10;再看负数,例如-5,左移一位后保留符号位不变,右端补零,应为-10;附上代码验证:
正数:#define _CRT_SECURE_NO_WARNINGS 1#pragma warning(disable:6031)#include<stdio.h>int main(){int a = 5;int b = a << 1;//左移一位printf("%d", b);return 0;}负数:#define _CRT_SECURE_NO_WARNINGS 1#pragma warning(disable:6031)#include<stdio.h>int main(){int a = -5;int b = a << 1;//左移一,符号位不变,右端补零printf("%d", b);return 0;}
2.右移操作符
右移操作符:>>
分为:算数右移和逻辑右移
介绍:算数右移,计算机系统以算数右移为主
规则:右移末尾舍弃,高位补符号位
仍看例子,例如正整数5,存储2进制为00000000000000000000000000000101,右移一位后变成00000000000000000000000000000010,对应十进制为2。再例如负整数-5,左移后高位补符号位,低位舍弃,-5对应的原码:
10000000000000000000000000000101;反码:111111111111111111111111111111111010
;补码111111111111111111111111111111111011,补码右移1位后变成111111111111111111111111111111111101,对应的反码:111111111111111111111111111111111100,对应的原码:
10000000000000000000000000000011,及二进制-3.下边附上验证代码:
5:#define _CRT_SECURE_NO_WARNINGS 1#pragma warning(disable:6031)#include<stdio.h>int main(){int a = 5;int b = a >> 1;//原码=反码=补码,原码右移一位,舍弃低位,结果为2printf("%d", b);return 0;}-5:#define _CRT_SECURE_NO_WARNINGS 1#pragma warning(disable:6031)#include<stdio.h>int main(){int a = -5;int b = a >> 1;//右移一位,补码符号位不变,舍弃低位,结果为-3printf("%d", b);return 0;}