64ビットの数値(0xffffffffffffff8c
)を8ビットの数値(0x8c
)に変換するにはどうすればよいですか?私のコード:64ビットの数値を8ビットに変換する方法
uint64_t val = 0xffffffffffffff8c;
uint8_t var = (uint8_t) (val & 0x0000FF);
私はそれを正しくやっていますか?
64ビットの数値(0xffffffffffffff8c
)を8ビットの数値(0x8c
)に変換するにはどうすればよいですか?私のコード:64ビットの数値を8ビットに変換する方法
uint64_t val = 0xffffffffffffff8c;
uint8_t var = (uint8_t) (val & 0x0000FF);
私はそれを正しくやっていますか?
uint64_t val = foo();
unsigned型に値を割り当てるが良好値が先の範囲外であっても、定義されているため、すべての行儀、方法以下4を考えます。実際にはユークリッドには "1つに宛先タイプの最大値"を加えたものです。
注:マスク定数0x0000FF
の先頭の0
は必要ありません。明快さを伝えるために必要に応じて先行ゼロを使用してください。 0xFF
または0x00000000000000FF
を使用できます。
OPのオリジナル:問題はありませんが、少し冗長です。 val
が整数型の場合は、&
が許されます。
uint8_t var = (uint8_t) (val & 0x0000FF);
キャスト、マスク無し。 (uint8_t)
への鋳造は0xFF
のマスクです。 一般的なでは、ポーティングコードに驚くほど効果があるため、マスキングは避けるべきです。この単純な例のように、符号なし固定幅型にキャストするときはそうではありません。
uint8_t var_nm = (uint8_t) val;
マスク、ないキャスト。上記のように。値の絞り込みは明示的にコード化されています。
uint8_t var_nc = val & 0xFF;
ノーキャスト、マスク無し。これは、ペダニック[-Wconversion]
またはそれと同等のものが使用されている場合、以下のような警告を生成することがあります。コードが狭くなることを期待していることは明らかではありません。
// warning: conversion to 'uint8_t {aka unsigned char}' from 'uint64_t
// {aka long long unsigned int}' may alter its value [-Wconversion]
uint8_t var_nc_nm = val;
コーディングの目標は1にある)機能2を行う)3効率的な合理的にそれを行う)の両方の現在および将来の意図の明確性を促進します。それは明らか範囲0-FFの値が2番目の選択肢として
uint8_t var_nc = val & 0xFF;
を狭めるためのコードの意図を伝えるようお勧めします、単に
uint8_t var = val;
のために行くと同じ実行可能コードが生成されることを期待しています。
-
マイナー:名val
とvar
はあまりにも一般的なものです。
&
もキャストも必要ありません(目的を明確にするために残しておきますが)。異なる整数型間で暗黙的に自由に変換することができ、符号なし整数の場合、オーバーフローの振る舞い(実際には "下位バイトのみを取る"という意味)はよく定義されています。
[C++:Bitwise AND](http://stackoverflow.com/questions/10373240/c-bitwise-and)の重複している可能性があります(これはC++の質問ですが、ビット単位の操作はこの限りでなければなりません)質問は関係あります。) – cxw
ANDは必要ですか? – hatchet
@hatchetマスクやキャストは、狭くなる可能性のある値を割り当てることに関する児童の警告を静めるのに便利です。 – chux