How do I handle a 4-byte char array as a typical int in ANSI C?
いくつかのコンテキスト:
4バイトの符号なし整数を読み取る必要があるバイナリファイルを解析しています。
このパーサーがどのプラットフォームでコンパイルされていても、「int」の長さは常に4バイトであることを確認したいと思います。
uint32_tとその友達について読んだことがありますが、ANSICに限定されています。
前もって感謝します。
How do I handle a 4-byte char array as a typical int in ANSI C?
いくつかのコンテキスト:
4バイトの符号なし整数を読み取る必要があるバイナリファイルを解析しています。
このパーサーがどのプラットフォームでコンパイルされていても、「int」の長さは常に4バイトであることを確認したいと思います。
uint32_tとその友達について読んだことがありますが、ANSICに限定されています。
前もって感謝します。
そこにいくつかのプリプロセッサコマンドを投げます
#include <limits.h>
#if LONG_BIT == 32
long buffer [BUFFER_SIZE];
#elif WORD_BIT == 32
int buffer [BUFFER_SIZE];
#endif
実行時にsizeof(int)を使用することもできます。
データをオーバーレイしようとするよりも、次のようなことを行うための関数を作成する方がよい場合があります。これは、最大の移植性uint32 GetUInt32LE(unsigned char *dat)
として実装できます(適切に定義されていると仮定します)。または、システムでもう少し簡単に定義できます。ここで、aは32ビット以上であることがわかっていました。16ビットしかない小規模なシステム用の組み込みコンパイラがまだいくつかあるため、個々のバイトにキャストする必要があることに注意してください。キャストreturn ((uint32)(dat[3]) << 24) | ((uint32)(dat[2]) << 16) | ((uint32)(dat[1]) << 8) | dat[0];
uint32
int
int
dat[1]
0xFFのようなバイト値を8だけ左にシフトすると、未定義の動作が発生し、実際の結果は(int)(0xFF00)として解釈され、0xFFFFFF00に符号拡張されて、結果の上位2バイト。