0

これは、高級プログラミング言語で自分を甘やかすために得たものです。


32 ビット値をバッファーに書き込み、uint64_tスタックに書き込む関数があります。次のコードはそれを保存する適切な方法ですか?

uint64_t size = 0;
// ...
getBytes((uint32_t*)&size+0x1);

これが標準的で安全なスタイルになると思います:

uint64_t size = 0;
// ...
uint32_t smallSize;
getBytes(&smallSize);
size = smallSize;
4

2 に答える 2

3

いいえ。ビッグエンディアンのマシンでのみ正しく動作します。そして、最初にそれをチェックすることさえせずに、特定のバイト順序を想定することは正気ではありません。

現在、プログラムがビッグ エンディアンのマシンでのみ実行されると確信していても、将来リトルエンディアンのマシンで実行する必要があるかどうかはわかりません。(私がこれを書いているのは、数十年にわたってビッグ エンディアン プロセッサを使用し、その後数年前にリトルエンディアン プロセッサに切り替えた会社が製造したコンピュータであり、現在では特定のデバイスでバイ エンディアン プロセッサを使用することで大きな成功を収めています ;- )))

于 2010-06-07T21:07:55.563 に答える
0

getBytes() が uint64_t を返すようにしないのはなぜですか? また、引数 (int * など) を使用して、エラー コードがあればそれを返します。

私の個人的な経験から、本当に 2 つのコード パスを統合したい場合は、両方で uint64_t を使用してください。

また、"(uint32_t*)&size" は C99 の厳密なエイリアシング ルールに違反していることにも注意してください (たとえば、GCC では最適化を無効にする必要があります)。

于 2010-06-07T23:17:13.060 に答える