[解決済み] int型から4バイトchar型配列への変換(C)
質問
ユーザから入力された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]);
関連
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
C: 1を求める! + 2! + 3! + ... + n! (ループ)
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] 難読化Cコードコンテスト2006。sykes2.cの解説をお願いします。
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Cエラー [エラー] 代入_Ashesの左オペランドにlvalueが必要です-プログラマーズ・シークレット
-
error: 'for' loop initial declaration is only allowed in C99 mode 原因と解決方法
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み】ストリクト・エイリアシング・ルールとは何ですか?