1. ホーム
  2. c

[解決済み] int型から4バイトchar型配列への変換(C)

2023-05-15 01:08:33

質問

ユーザから入力されたintを4バイトに変換して、文字配列に代入したいのですが、どうすればよいでしょうか。どうすればいいのでしょうか?

例です。

175のユーザー入力を

00000000 00000000 00000000 10101111


これまでのすべての回答との問題で、255を変換すると、次のようになります。 0 0 0 ff とプリントアウトされますが。 0 0 0 ffffffff

unsigned int value = 255;   

buffer[0] = (value >> 24) & 0xFF;
buffer[1] = (value >> 16) & 0xFF;
buffer[2] = (value >> 8) & 0xFF;
buffer[3] = value & 0xFF;

union {
    unsigned int integer;
    unsigned char byte[4];
} temp32bitint;

temp32bitint.integer = value;
buffer[8] = temp32bitint.byte[3];
buffer[9] = temp32bitint.byte[2];
buffer[10] = temp32bitint.byte[1];
buffer[11] = temp32bitint.byte[0];

はどちらも 0 0 0 ffffffff ではなく 0 0 0 ff

もう一つの例として、入力が 175 のようにプリントアウトされます。 0, 0, 0, ffffffaf と表示され、本来なら 0, 0, 0, af

どのように解決するのですか?

この ポータブル の方法(確実に 0x00 0x00 0x00 0xaf をどこでも得られるようにする)方法は、シフトを使用することです。

unsigned char bytes[4];
unsigned long n = 175;

bytes[0] = (n >> 24) & 0xFF;
bytes[1] = (n >> 16) & 0xFF;
bytes[2] = (n >> 8) & 0xFF;
bytes[3] = n & 0xFF;

ユニオンを使ったメソッドと memcpy() を使用するメソッドは、マシンによって異なる結果を得るでしょう。


あなたが抱えている問題は、変換ではなく、印刷にあります。 あなたが使用しているのは char ではなく unsigned char というような行を使って表示していますね。

printf("%x %x %x %x\n", bytes[0], bytes[1], bytes[2], bytes[3]);

よりも狭い型がある場合 int に渡されます。 printf に渡されると、それらは int (または unsigned int であれば int が元の型の全ての値を保持できない場合)。 もし char があなたのプラットフォームで署名されているならば 0xff はその型の範囲に収まらない可能性が高いので、代わりに -1 が設定されています (この表現は 0xff という表現になります)。

に昇格し、-1 は int に昇格し、次のような表現になります。 0xffffffff として int として、あなたのマシンに表示されます。

あなたの解決策は、実際に unsigned char を使うか、あるいは unsigned char の中で printf ステートメントを使用します。

printf("%x %x %x %x\n", (unsigned char)bytes[0],
                        (unsigned char)bytes[1],
                        (unsigned char)bytes[2],
                        (unsigned char)bytes[3]);