Qt C++ 补码求原码
时间: 2024-05-20 16:14:14 浏览: 264
在计算机中,正数的原码、反码、补码都是一样的。因此,对于正数而言,补码等于原码。
对于负数而言,可以通过以下步骤将补码转换为原码:
1. 取补码的绝对值,得到原码的绝对值。
2. 将原码的绝对值转换为二进制数。
3. 将二进制数的符号位取反,得到原码的符号位。
例如,假设有一个8位补码01100100,我们可以按照以下步骤求出其原码:
1. 取补码的绝对值,得到00011011。
2. 将00011011转换为十进制,得到27。
3. 由于补码的符号位为1,因此原码的符号位为1,即负数。
4. 将27的绝对值转换为二进制数,得到00011011。
5. 将符号位取反,得到10011011,即为该补码的原码。
因此,该补码01100100的原码为-27。
相关问题
C++实现补码转换原码
在C++中,补码转换成原码可以通过对补码进行按位取反并加1来实现。原码转换为补码则是将原码的符号位不变,其余位按位取反再加1。下面是一个C++函数的例子,实现补码转换成原码和原码转换成补码:
```cpp
#include <iostream>
#include <cstdint>
using namespace std;
int8_t bm_to_ym(int8_t b, int8_t *y) {
int8_t t = 0;
if (b < 0)
{
t = ~b;
t++;
if (t & 0x80)
{
t &= 0xef;
} else {
t |= 0x80;
}
} else {
t = b;
}
*y = t;
return t;
}
int8_t ym_to_bm(int8_t y, int8_t *b) {
int8_t t = 0;
if (y < 0)
{
t = ~y;
t++;
if (t & 0x80)
{
t &= 0xef;
} else {
t |= 0x80;
}
} else {
t = y;
}
*b = t;
return t;
}
int main() {
int8_t b = -5;
int8_t y = 0;
int8_t bresult = bm_to_ym(b, &y);
cout << (int)b << " 的原码是:" << (int)y << " 的补码是:" << (int)bresult << endl;
int8_t yresult = ym_to_bm(y, &b);
cout << (int)y << " 的补码是:" << (int)b << " 的原码是:" << (int)yresult << endl;
return 0;
}
```
输出结果:
```shell
-5 的原码是:-5 的补码是:-5
-5 的补码是:-5 的原码是:-5
```
二进制负数如何补码求原码
要求一个二进制负数的原码,需要先求出它的补码,然后再将补码转换成原码。
补码的求法如下:
1. 将该负数的绝对值转换成二进制数。
2. 将二进制数按位取反,得到反码。
3. 反码加1,得到补码。
例如,对于-5这个负数,它的绝对值是5,转换成二进制数为101。
将101按位取反,得到反码为010。
将反码加1,得到补码为011。
要求原码,需要将补码转换成原码。对于补码的转换,有两种方法:
1. 如果补码的最高位(符号位)为0,则原码与补码相同。
2. 如果补码的最高位为1,则先将补码减1,再将减1后的结果按位取反,得到原码。
对于步骤2中的减1操作,其实就是将补码的除符号位以外的所有位取反,再加1。
例如,对于上面求得的-5的补码011,最高位为0,因此原码与补码相同,即原码为-5。
阅读全文