欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

c语言十四:原码反码补码

时间:2023-04-28
原码 反码 补码

一 计算机用补码的作用1是 把减法运算变成加法运算二 计算机用补码的作用2是统一了-0和+0的编码三 查看内存中原样数据四 数据的存储

4.1 有符号负数4.2 有符号正数4.3 十六进制数4.4 八进制数4.5 越界的数据4.6 无符号数赋正值4.7 无符号数赋负值4.8 总结 五 数据的读取

5.1 %d, %hd, %ld有符号取5.2 %u, %x, %o, %lu无符号取5.3 例子5.4 总结

无符号数和有符号正数的原码 反码 补码相同
有符号负数的反码是原码除最高位外,其他位都取反;补码是反码加1

一 计算机用补码的作用1是 把减法运算变成加法运算

6-10=-46+(-10)如果没有补码0000 01101000 1010----------1001 0000 -16错误的如果有补码0000 01101000 1010 --反码-->1111 0101 --补码-->1111 0110----------------------------------------------1111 1100计算后得到这个值,这个是补码,然后将其减一变成反码,在取反变成原码-->1111 1011-->1000 0100=-4正确的

二 计算机用补码的作用2是统一了-0和+0的编码 三 查看内存中原样数据

printf配合格式化输出的%x, %u, %o输出的都是内存中的原始数据

四 数据的存储 4.1 有符号负数

在内存中存储的是补码

4.2 有符号正数

在内存中存储的是原码

4.3 十六进制数

在内存中存储的是原码

4.4 八进制数

在内存中存储的是原码

4.5 越界的数据

在内存中存储的是原码

[root@ansible9 ~]# cat test.c#include int main(int argc, char *argv[]){char data=129; //二进制为 1000 0001printf("%xn", data);}[root@ansible9 ~]# gcc -Wall test.c[root@ansible9 ~]# ./a.out ffffff81

4.6 无符号数赋正值

在内存中存储的是原码

[root@ansible9 ~]# cat test.c#include int main(int argc, char *argv[]){unsigned char data=10; //二进制为 0000 1010printf("%xn", data);}[root@ansible9 ~]# gcc -Wall test.c[root@ansible9 ~]# ./a.out a

4.7 无符号数赋负值

在内存中存储的是补码

[root@ansible9 ~]# cat test.c#include int main(int argc, char *argv[]){unsigned char data=-10; //二进制为 1000 1010printf("%xn", data);}[root@ansible9 ~]# gcc -Wall test.c[root@ansible9 ~]# ./a.out f6

4.8 总结 计算机在内存存储的是原码还是补码是看数值的,数值是正数就存原码;是负值就存补码;变量名前的类型只能决定分配给变量的内存大小; 五 数据的读取 5.1 %d, %hd, %ld有符号取

有符号读取首先看二进制为最高位是不是1:

如果是1就将内存中数据符号位不变,其他位取反,然后再加1,转换为原码;如果是0就原样输出; 5.2 %u, %x, %o, %lu无符号取

内存数据原样输出

5.3 例子

[root@ansible9 ~]# cat test.c#include int main(int argc, char *argv[]){//有符号负数printf("有符号负数n");char data1=-10; //内存中数据 1111 0110printf("x是内存原样输出:%xn", data1 & 0xff);printf("d的结果:%dn", data1);//有符号正数printf("有符号正数n");char data2=10; //内存中数据 0000 1010printf("x是内存原样输出:%xn", data2 & 0xff);printf("d的结果:%dn", data2);//十六进制printf("十六进制n");char data3=0xae; //内存中数据 1010 1110printf("x是内存原样输出:%xn", data3 & 0xff);printf("d的结果:%dn", data3);//八进制printf("八进制n");char data4=0256; //内存中数据 1010 1110printf("x是内存原样输出:%xn", data4 & 0xff);printf("d的结果:%dn", data4);//越界数据printf("越界数据n");char data5=129; //内存中数据 1000 0001printf("x是内存原样输出:%xn", data5 & 0xff);printf("d的结果:%dn", data5);//无符号正数printf("无符号正数n");unsigned char data6=10; //内存中数据 0000 1010printf("x是内存原样输出:%xn", data6 & 0xff);printf("d的结果:%dn", data6);//无符号负数printf("无符号负数n");unsigned char data7=-10; //内存中数据 1111 0110printf("x是内存原样输出:%xn", data7 & 0xff);printf("d的结果:%dn", data7);}[root@ansible9 ~]# gcc -Wall test.c[root@ansible9 ~]# ./a.out 有符号负数x是内存原样输出:f6d的结果:-10有符号正数x是内存原样输出:ad的结果:10十六进制x是内存原样输出:aed的结果:-82八进制x是内存原样输出:aed的结果:-82越界数据x是内存原样输出:81d的结果:-127无符号正数x是内存原样输出:ad的结果:10无符号负数x是内存原样输出:f6d的结果:246

5.4 总结

从内存里取数据

用%d,%hd,%ld时,是有符号取

当内存里数据的最高位是1时:将内存数据符号位不变其他位取反,然后再加1变为原码后输出当内存里数据的最高位是0时:将数据原样输出

用%u,%x,%o,%lu时,是无符号取:将内存里的数据原样输出

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。