我知道有一个二进制字符串10001110
正在使用2的补码。我知道它将是8位。
以unsigned int
的形式给予我,等于142.
然后我需要将其转换回10001110
然后反转所有位并添加一个等于01110010
然后将其转换为signed int
等于-114。
我该怎么做?我对C比较陌生,并且花了很多时间试图解决这个问题!
基本上我想编写一个取unsigned int
142并返回signed int
-114
答案 0 :(得分:2)
您无需更改位模式。您只需要签名扩展以匹配signed 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 :(得分:2)
考虑一下使用按位运算符可以做些什么。您可以像这样测试一个位是1还是0:
int bit = value & 1;
您也可以将int中的位移位:
val = val >> 1;
要测试int中的第i位,你可以这样做:
int bit = (value >> i) & 1;
因此,使用这些信息,您可以将给定的整数转换为二进制并将其存储在一个char数组中(如果你计算在内,它将按相反的顺序排列!)然后根据您的喜好操作char。希望这是一个足够大的暗示让你站起来并开始。
答案 2 :(得分:0)
难道你不能从你给出的任何值中减去256吗?
答案 3 :(得分:0)
老兄 - 你为什么要关闭原来的问题????
我的回答与第一个相同:
整数是整数。无论是“签名”还是“未签名”;无论是“补充”还是“补充” - 这些位总是相同的。
如果您想将签名值“转换”为无符号值,C cast通常是最好,最简单,最有效和最清晰的方法(下面的代码示例)。
绝大多数CPU架构都是两个补充
如果出于某种原因,您想要检查您的CPU架构是否是补充,那么只需测试-0 == +0
。二进制补码不 “负零”(仅为零)。一致补充。
PS:
问:基本上我想编写一个带有unsigned int的函数 142并返回signed int -114
A:
int silly_convert (int i)
{
return (signed char)i;
}
这与我在原帖中的回复完全相同。
答案 4 :(得分:-1)
这是我最终提出的解决方案。
#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);
}
感谢大家的帮助!