- (꒪ꇴ꒪(꒪ꇴ꒪ ),hello我是祐言
- 博客主页:C语言基础,Linux基础,软件配置领域博主🌍
- 快上🚘,一起学习!
- 送给读者的一句鸡汤🤔:
- 集中起来的意志可以击穿顽石!
- 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏
一、认识原码反码补码
原码、补码和反码是用来表示有符号整数的三种表示方法,它们在计算机中常用于进行数值运算和存储。
1.原码(Sign-Magnitude Representation)
最高位为符号位(0 表示正数,1 表示负数),其余位表示数值部分。
例如,正数 +5 的原码为 00000101,负数 -5 的原码为 10000101。
2.反码(One's Complement Representation)
正数的反码与其原码相同。
负数的反码是将其原码中除符号位外的每一位取反(0 变为 1,1 变为 0)。
例如,正数 +5 的反码为 00000101,负数 -5 的反码为 11111010。
3.补码(Two's Complement Representation)
正数的补码与其原码相同。
负数的补码是在其反码的基础上加 1。
这里要注意一点:补码的最高位仍然表示符号位。
例如,正数 +5 的补码为 00000101,负数 -5 的补码为 11111011。
二、计算机中补码表示法特点
- 可以同时表示正数和负数,且不需要额外的符号位,简化了数值运算和逻辑判断。
- 补码的加法和减法操作可以使用相同的硬件电路,简化了计算机的设计。
- 补码的溢出操作符合模运算的性质。
在进行原码、反码和补码之间的转换时,需要注意以下几点:
(1)由于负数的补码是在其反码的基础上加 1,所以对于负数,要先将其转换为反码,然后再加 1 得到补码。
(2)对于补码,将其减 1 可以得到其反码,再将反码的每一位取反可以得到原码。
(3)这些表示法的选择取决于具体的应用和计算机系统的设计,补码表示法是最常用的一种,因为它简化了数值运算和编码逻辑,且可以有效地处理负数溢出。
示例展示:
程序:
#include <stdio.h>
// 原码转换为反码
int originalToComplement(int original) {
if (original >= 0) {
return original;
} else {
return ~original;
}
}
// 反码转换为原码
int complementToOriginal(int complement) {
if (complement >= 0) {
return complement;
} else {
return ~complement;
}
}
// 原码转换为补码
int originalToTwosComplement(int original) {
if (original >= 0) {
return original;
} else {
return ~original + 1;
}
}
// 补码转换为原码
int twosComplementToOriginal(int twosComplement) {
if (twosComplement >= 0) {
return twosComplement;
} else {
return ~twosComplement + 1;
}
}
int main() {
int num = -5;
int complement = originalToComplement(num);
int original = complementToOriginal(complement);
int twosComplement = originalToTwosComplement(num);
int originalFromTwosComplement = twosComplementToOriginal(twosComplement);
printf("原码:%d\n", num);
printf("反码:%d\n", complement);
printf("补码:%d\n", twosComplement);
printf("从补码转换回原码:%d\n", originalFromTwosComplement);
return 0;
}
📢写在最后
- 今天的分享就到这啦~
- 觉得博主写的还不错的烦劳
一键三连喔
~ - 🎉感谢关注