2

ここで、整数をバイナリ表現で出力するコードを取得しました

#define BUF_SIZE 33
int main() {
    for (int count = 0; count <=25; count++){

        char buffer[BUF_SIZE];
        buffer[BUF_SIZE - 1] = '\0';

        int2bin(count, buffer, BUF_SIZE - 1);
        printf("%d = %s \n",count, buffer);
    }
}

char *int2bin(int a, char *buffer, int buf_size) {
    buffer += (buf_size - 1);

    for (int i = 31; i >= 0; i--) {
        buffer--;
        *buffer = (a & 1) + '0';
        a >>= 1;
    }

    return buffer;
}

いくつかのコード行を置き換えようとするまで、うまく機能します

int2bin(count, buffer, BUF_SIZE - 1);
printf("%d = %s \n",count, buffer);

printf("%d = %s \n",count, int2bin(count, buffer, BUF_SIZE - 1));

これらのログで出力が完全に壊れます。

805306368 = 00000000000000000000000000000000
805306369 = 00000000000000000000000000000001
805306370 = 00000000000000000000000000000010
805306371 = 00000000000000000000000000000011
805306372 = 00000000000000000000000000000100
805306373 = 00000000000000000000000000000101

等々...

その理由を説明していただけますか?

4

6 に答える 6

4

一見、ファースト-1インint2bin()は必要ないように見えます (ループ開始が 1 -1 の場合)

説明については、Scott Mermelsteinの回答を参照してください

于 2013-04-12T14:04:42.920 に答える
3

int2bin ではバッファの前のバイトを「0」で上書きします。コンパイラは、printfのパラメータ「count 」をこの場所に置きました。

呼び出しで「-1」を削除するだけです

printf("%d = %s \n",count, int2bin(count, buffer, BUF_SIZE));

でした 805306368 はバイナリです

00110000 00000000 00000000 00000000

00110000 = 48 = '0'

コードには別の欠陥があります。ループ回数は buf_size に依存します! このように書き直すことをお勧めします。

#define BUF_SIZE sizeof(int)
int main() {
  for (int count = 0; count <=25; count++){

    char buffer[BUF_SIZE + 1];
    buffer[BUF_SIZE] = '\0';

    int2bin(count, buffer, BUF_SIZE);
    printf("%d = %s \n",count, buffer);
  }
}

char *int2bin(int a, char *pBuffer, int buf_size) {
   char *buffer = pBuffer + buf_size;

   for (int i = buf_size; i > 0; i--) { // loop count depends on buf_size!!!
     buffer--;
     *buffer = (a & 1) + '0';
     a >>= 1;
   }

   return pBuffer;
}
于 2013-04-12T14:16:33.370 に答える
2

関数を次のように呼び出す必要があります

int2bin(count, buffer, BUF_SIZE)

それ以外の場合、関数はビット文字を書き込みますbuffer minus 1byte(これは、メモリ内にゴミを配置するアンダーフローです)。buffer + 31 bytes

于 2013-04-12T14:12:43.430 に答える
0

何が問題なのかに加えてbuffer_size(他の回答はすでにそれを詳細に説明しています)。最も簡単な修正は追加することです

#include <stdio.h>

char * int2bin(int a, char * buffer, int buf_size);

コードの先頭に。それは私のためにコンパイルして動作させました。両方とも

int2bin(count, buffer, BUF_SIZE - 1);
printf("%d = %s \n",count, buffer);

printf("%d = %s \n", count, int2bin(count, buffer, BUF_SIZE));
于 2013-04-12T14:18:26.500 に答える