3

MSB、LSB、符号、大きさの 1 と 2 の補数などを認識しています。次に、ビット操作を行う書き込みおよびプログラムを行っているかどうかを知りたいのですが、メモリ内の実際のビット レベル データを確認するにはどうすればよいですか?

つまり、それが4 ビット表現であるか、またはそれであるかをint a = -1;どのように知ることができますか?100111101111

実装が負の数を表すために使用する方法をどのように理解すればよいですか?

C プログラムのビット レベル データを調べる方法を探しています。

現在のプラットフォームは Ubuntu 12.04 LTS です。繰り返しますが、問題はそれがどのように行われるかではありません。それは、それが何らかの方法で行われたことをどのように発見または正当化するかについてです。

4

8 に答える 8

3
union { int i; unsigned u; } x;
x.i = -1;

x.uこれで、同じビットを持つ符号なし整数が得られます。符号なしの数値を表す方法は 1 つしかないため、それを調べることができます。(ヒント: 2 の補数である可能性が最も高いです。)

printf("%x\n", x.u);

上記の print ステートメントは、ビットを決定するために使用できる符号なし整数の 16 進表現を出力します。

于 2012-06-20T19:25:02.503 に答える
1
void showBit(int num, int nBit)//nBit -> number of bits
{
    unsigned int temp = 1<<(nBit-1), i;

    for(i=0; i<nBit; ++i)
    {
        printf("%d ", ((num&temp)?1:0) );
        temp = temp>>1;
    }
    printf("\n");
}  

この関数を使用して、バイナリ表現を印刷できます。ideoneでご覧ください。

于 2012-06-20T19:33:08.287 に答える
1

C では、負の数は、符号付き数値の 2 の補数形式で表されます。

これは、コンパイラを回避するために行われます (つまり、int が 8 ビット、16 ビット、32 ビットなどであっても機能します)。

あなたの場合、コンパイラが int を 8 ビットとして解釈すると、1111 1111 が格納されます。最初のビット (符号ビット) が 1 になるとすぐに、コンパイラはそれが負の数であることを理解し、その数が 2 の補数でなければならないことを理解します。これは 0000 0001 に過ぎず、負の符号が付いています

于 2014-02-18T11:06:05.583 に答える
1

ビット演算を適用する。たとえば、実行して n 番目のビットが設定されているかどうかをテストできますa & (1<<n)(ループで適用すると、整数が得られます)。

編集:しかし、これは内部表現がバイナリの場合にのみ機能します。異なるシステム (たとえば、ロシア人は 70 年代に 3 進論理と数システムを備えたコンピューターを使用し、ポーランド人はネガバイナリ ベースのシステムを使用した場合) を使用すると、内部で使用される正しい形式が得られません。

于 2012-06-20T19:25:48.830 に答える
1

簡単な方法の 1 つは、次のようにデバッガーで変数を検査することです。

(gdb) p/t var

p/tバイナリ表現を出力するように指示します。

于 2012-06-20T19:26:53.517 に答える
0

unionを使用することもできます。

union num
{
    int f;
    char c[4];
};

void printBinary(union num u)
{
    int i,t,j;

    for(i=sizeof(u)-1; i>=0; i--)
    {
            for(j=0,t=128; j<8; j++,t>>=1)
                    printf("%d",(u.c[i]&t)?1:0);
            printf(" ");
    }
}

int main() 
{
    union num n;
    n.f=10;
    printBinary(n);
    return 0;
}

こちらをご覧ください: http://ideone.com/i9YCt

于 2012-06-20T20:12:00.653 に答える
0

数値の 8 番目のビットによって識別される正と負の数値。8 番目のビットが 0 の場合は正、それ以外の場合は負です。

For example x=8
so In binary x=8=0000 1000 (It is positive number, so eight bit is 0 from right to left)

For negative x = -8
The negative numbers are represented in binary using 2's complement usually.
 so x = -8 

step 1 binary of        8 = 0000 1000
step 2 1's complement     = 1111 0111
step 3 2's complement     =         1
                         y = 1111 1000 =248(so it represents the negative because 8th bit is 1 then it follows the below formula)

The formula for getting negative value from binary representation is 2^8-y
 so 256-248=8
于 2017-02-21T14:29:07.720 に答える
0

実装が負の数を表すために使用する方法をどのように理解すればよいですか?

方法は次のとおりです。

unsigned int a = -1;
swicth (a & 3U)
{
    case 3:
        printf("two's complement\n");
        break;

    case 2:
        printf("one's complement\n");
        break;

    case 1:
        printf("sign and magnitude\n");
        break;

    default:
        printf("compiler broken\n");
        break; 
}

最終的な答えは、実際にはコンパイラのドキュメントにあります。これは、どの署名付き表現が使用されているかを文書化するために必要です。たとえば、次の場合gcc:

符号付き整数型が符号と大きさ、2 の補数、または 1 の補数を使用して表現されるかどうか、および異常な値がトラップ表現であるか通常の値であるか (C99 6.2.6.2)

GCC は 2 の補数の整数型のみをサポートし、すべてのビット パターンは通常の値です。

http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html

于 2012-06-20T21:16:28.207 に答える