-1

我知道有一个二进制字符串10001110正在使用 2 的补码。我知道它将是 8 位。

unsigned int它以等于 142的形式提供给我。

然后我需要将其转换回10001110

然后反转所有位并添加一个导致它等于01110010

然后将其转换为signed int等于 -114。

我怎样才能做到这一点?我对 C 语言比较陌生,并且花了很长时间试图弄清楚它!

本质上,我想编写一个接受unsigned int142 并返回signed int-114的函数

4

5 回答 5

2

您无需更改位模式。您只需要进行符号扩展以匹配已签名 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.

于 2012-12-04T23:07:42.460 回答
2

想想你可以用位运算符做什么。您可以像这样测试一个位是 1 还是 0:

int bit = value & 1;

您还可以像这样移动 int 中的位:

val = val >> 1;

要测试 int 中的第 i 位,您可以这样做:

int bit = (value >> i) & 1;

因此,使用此信息,您可以将给定的整数转换为二进制并将其存储在一个 char 数组中(如果您向上计数,它将以相反的顺序排列!)然后根据您的喜好操作 char。希望这是一个足够大的提示,可以让您站起来并开始。

于 2012-12-04T23:09:48.053 回答
0

你不能从给定的任何值中减去 256 吗?

于 2012-12-04T23:25:06.600 回答
0

伙计 - 你为什么关闭你原来的问题????

我的回答和第一个一样:

  • 整数是整数。无论是“签名”还是“未签名”;无论是“一个补码”还是“二进制补码” - 位总是相同的。

  • 如果您想将有符号值“转换”为无符号值,C 转换通常是最好、最简单、最有效和最清晰的方法(下面的代码示例)。

  • 绝大多数 CPU 架构都是二进制补码

  • 如果出于某种原因,您想检查您的 CPU 架构是否是互补的,那么只需测试-0 == +0. 二进制补码没有“负零”(只有零)一个补码可以。

PS:

问:本质上我想写一个函数,它接受无符号整数 142 并返回有符号整数 -114

A:

int silly_convert (int i)
{
  return (signed char)i;
}

这与我在回复您的原始帖子时所建议的完全相同。

于 2012-12-05T03:55:21.303 回答
-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);

}

感谢大家的帮助!

于 2012-12-05T14:55:31.947 回答