我知道有一个二进制字符串10001110
正在使用 2 的补码。我知道它将是 8 位。
unsigned int
它以等于 142的形式提供给我。
然后我需要将其转换回10001110
然后反转所有位并添加一个导致它等于01110010
然后将其转换为signed int
等于 -114。
我怎样才能做到这一点?我对 C 语言比较陌生,并且花了很长时间试图弄清楚它!
本质上,我想编写一个接受unsigned int
142 并返回signed int
-114的函数
我知道有一个二进制字符串10001110
正在使用 2 的补码。我知道它将是 8 位。
unsigned int
它以等于 142的形式提供给我。
然后我需要将其转换回10001110
然后反转所有位并添加一个导致它等于01110010
然后将其转换为signed int
等于 -114。
我怎样才能做到这一点?我对 C 语言比较陌生,并且花了很长时间试图弄清楚它!
本质上,我想编写一个接受unsigned int
142 并返回signed int
-114的函数
您无需更改位模式。您只需要进行符号扩展以匹配已签名 int 结果的位长度。最简单的方法是检查输入的符号位,然后如果设置了位长度,则将 -1 向左筛选。
int toSignedInt(unsigned int value, int bitLength)
{
int signedValue = value;
if (value >> (bitLength - 1))
signedValue |= -1 << bitLength;
return signedValue;
}
解释
在 8 位二进制补码中,无符号 142 和有符号 -114 的位模式相同。所以如果你的整数类型是 8 位,你只需要转换类型。但是,如果您有 32 位整数,但您想将它们视为 8 位二进制补码,那么您需要将左侧 24 位设置为 1,如果符号位是1.
想想你可以用位运算符做什么。您可以像这样测试一个位是 1 还是 0:
int bit = value & 1;
您还可以像这样移动 int 中的位:
val = val >> 1;
要测试 int 中的第 i 位,您可以这样做:
int bit = (value >> i) & 1;
因此,使用此信息,您可以将给定的整数转换为二进制并将其存储在一个 char 数组中(如果您向上计数,它将以相反的顺序排列!)然后根据您的喜好操作 char。希望这是一个足够大的提示,可以让您站起来并开始。
你不能从给定的任何值中减去 256 吗?
伙计 - 你为什么关闭你原来的问题????
我的回答和第一个一样:
整数是整数。无论是“签名”还是“未签名”;无论是“一个补码”还是“二进制补码” - 位总是相同的。
如果您想将有符号值“转换”为无符号值,C 转换通常是最好、最简单、最有效和最清晰的方法(下面的代码示例)。
绝大多数 CPU 架构都是二进制补码
如果出于某种原因,您想检查您的 CPU 架构是否是互补的,那么只需测试-0 == +0
. 二进制补码没有“负零”(只有零)。一个补码可以。
PS:
问:本质上我想写一个函数,它接受无符号整数 142 并返回有符号整数 -114
A:
int silly_convert (int i)
{
return (signed char)i;
}
这与我在回复您的原始帖子时所建议的完全相同。
这是我最终想出的解决方案。
#include <stdio.h>
#include <stdlib.h>
int getBit(int no, int bit) // get bit at certain position
{
bit--;
return (no & (1 << bit)) >> bit;
}
void complementNBits(int *no, int count) // invert certain number of bits
{
int i;
for(i=0; i<count; i++)
{
*no ^= 1 << i;
};
}
int main()
{
unsigned int unsignedNo=142;
int negative = 0;
signed int signedNo=0;
// check if MSB is set to determine if negative
if (getBit(unsignedNo, 8)) // if MSB is set
{
negative = 1;
// invert these 8 bits and add 1. the rest of the MSBs will already be 0
complementNBits(&unsignedNo, 8);
unsignedNo++;
}
signedNo = unsignedNo;
if (negative)
{
signedNo = signedNo * -1;
}
printf("THE SIGNED INTEGER: %i\n", signedNo);
}
感谢大家的帮助!