五.原码反码补码
编码规则
不同文件有不同的编码规则
11010101
无符号数当中0xD5 213 有符号数时并非-213
正数的原码反码补码相同
表示: 1 00000001 6 00000110
正数的原码补码在计算机中的表示
int main(int argc,char*argv[])
{
char x = 1; #用到的数据宽度为8位
printf("%x\n",&x); #打印一下这个值在内存中的位置
return 0;
}
找到内存中的值搜索到address,找到对应的值位01 转化位二进制为00000001
所以正数在内存中存的就是当前这个数的原码。
负数的原码反码补码
Ⅰ.有符号数的编码规则
1原码 最高为为符号位,其余各位为数值的绝对值
2反码 正数的反码跟原码相同
负数:符号为为1,其余为对原码取反
3补码 正数的补码跟原码相同
负数:符号位为1,其余位为对原码取反加1
表示 -1 原码 10000001 反码11111110 补码 11111111
表示 -7 原码 10000111 反码11111000 补码 11111001
int main(int argc,char*argv[])
{
char x = -1; #用到的数据宽度为8位
printf("%x\n",&x); #打印一下这个值在内存中的位置
return 0;
}`在这里插入代码片`在这里插入代码片
得出结论为-1在内存中的值为FF即
!!!负数在内存中以补码的形式中存在.
有无符号数区分表
六.无符号有符号数
Ⅰ.无符号数的编码规则
这个数是多少就存多少
10011010 是一个无符号数的话则为0x9A 数的绝对值 只有正数
Ⅱ.有符号数的编码规则
有符号数最高为是0的话 这个数一定是个正数
有符号数最高为为1的话 这个数一定是一个负数
00011010 是1A
10011010 是
int main(int argc,char*argv[])
{
int x = 0x1A000000;
printf("以无符号形式显示:%u\n",x);
printf("以有符号形式显示:%d\n",x);
return 0;
}
以无符号形式显示:436207616
以有符号形式显示:436207616
则说明有符号数为正时与无符号形式的编码方式是一样的。
int main(int argc,char*argv[])
{
int x = 0x9A000000;
printf("以无符号形式显示:%u\n",x);
printf("以有符号形式显示:%d\n",x);
return 0;
}
以无符号形式显示:2583691264
以有符号形式显示:-1711276032
0x9A时 10011010
-1,711,276,032
FFFF FFFF 9A00 0000
1111 1111 1111 1111 1111 1111 1111 1111 1001 1010 0000 0000 0000 0000 0000 0000
七.计算机中的运算
运算
计算机只认识0和1,归根结底计算机就是对0和1做运算(通常成为位运算)
1 与运算
两个位都为1时结果才为1
1011 0001
and(&) 1101 1000
1001 0000
2.或运算
只要有一个位为1就是1
1011 0001
or(|) 1101 1000
1111 1001
3.异或运算
不一样的时候是1
1011 0001
xor(^) 1101 1000
0110 1001
4.非运算
0就是1,1就是0
1101 1000
not(~) 0010 0111
5.左移
各二进位全部左移若干位,高为丢弃低位补零
sh(<<) 1101 1000 左移两位为:0110 0000
6.右移
sar 11010101 1111 0101
对应C语言(>>)
int a = 10;
printf("%d\n,a>>2");