-1

100011102の補数を使用していることがわかっているバイナリ文字列があります。私はそれが8ビットになることを知っています。

unsigned intそれは142に等しいの形で私に与えられます。

次に、これをに変換し直す必要があります10001110

次に、すべてのビットを反転して1つ追加すると、次のようになります。01110010

次に、これをsigned int-114に変換します。

これどうやってするの?私はCに比較的慣れておらず、それを理解しようと何年も費やしてきました。

基本的に、142を受け取り、 -114unsigned intを返す関数を作成したいと思います。signed int

4

5 に答える 5

2

ビットパターンを変更する必要はありません。signed intの結果のビット長に一致するように、sign-extendする必要があります。これを行う最も簡単な方法は、入力の符号ビットをチェックしてから、ビット長が設定されている場合は-1を残してチェックすることです。

int toSignedInt(unsigned int value, int bitLength)
{
    int signedValue = value;
    if (value >> (bitLength - 1))
        signedValue |= -1 << bitLength;
    return signedValue;
}

説明

8ビット2のcomplelementでは、符号なし142と符号付き-114のビットパターンは同じです。したがって、整数型が8ビットの場合は、型を変換する必要があります。ただし、たとえば32ビットの整数があり、それらを8ビットの2の補数であるかのように扱いたい場合は、符号ビットが次の場合、左側の24ビットを1に設定する必要があります。 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;

したがって、この情報を使用して、指定された整数を2進数に変換し、それをchar配列に格納して(カウントアップするとすでに逆の順序になります!)、charを好みに合わせて操作できます。うまくいけば、これはあなたを立ち上がらせて始めるのに十分な大きさのヒントです。

于 2012-12-04T23:09:48.053 に答える
0

おい-なぜ元の質問を閉じたのですか????

私の応答は最初のものと同じです:

  • 整数は整数です。「署名済み」か「署名なし」か。「1の補数」であろうと「2の補数」であろうと、ビットは常に同じです。

  • 符号付きの値を符号なしの値に「変換」する場合は、通常、Cキャストが最適で、最も単純で、最も効率的で、最も明確なアプローチです(以下のコード例)。

  • CPUアーキテクチャの大部分は2の補数です

  • 何らかの理由で、CPUアーキテクチャが1の補数であるかどうかを確認したい場合は、をテストして-0 == +0ください。2の補数には、「負のゼロ」(ゼロのみ)はありませ。1の補数は行います。

PS:

Q:基本的に、unsigned int 142を受け取り、signedint-114を返す関数を作成したいと思います。

A:

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

これは、元の投稿への返信で提案したものとまったく同じです。

于 2012-12-05T03:55:21.303 に答える
0

与えられた値から256を引くことはできませんか?

于 2012-12-04T23:25:06.600 に答える
-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 に答える