signed 32 bit integer
に保存する値がsigned 8 bit
です。ビット値を使用してintにchar値を格納し、キャストなしで戻すときに値を保持する
私はビット単位のシフトを使用して値を移動すると、左のことを実行します。
const auto back_value1 = (merged_value >> 24) & 0x000000FF;
この作品:
const auto value1 = char{90};
const auto value2 = char{80};
const auto value3 = char{70};
const auto value4 = char{60};
auto merged_value = int32_t{0};
merged_value |= (value1 & 0x000000FF) << 24;
merged_value |= (value1 & 0x000000FF) << 16;
merged_value |= (value1 & 0x000000FF) << 8;
merged_value |= value1 & 0x000000FF;
をさて、私はこのようなことを行いますバックvalue1
merged_value
から取得したいとしましょうvalue1
が正の数である限り素晴らしいですが、値が負の場合、戻り値は間違っています。例えば
value1
が-80
であれば、その後back_value1
は(back_value1
がint32_t
あるため)、最上位ビット(正または負のビット)がビット位置7
でなく31
であるためにです、176
であろう。
char
をback_value1
にキャストするだけで、-80
という値が返されることがわかりました。しかし、私が欲しいのは、正しい値-80
〜back_value1
をback_value1
がint32_t
とし、キャストなしでになるビット演算です。
おかげで
編集:
ニールバターワース私はここに全体のコードをポストすることを求めた代わりのオンラインIDE上、そうここにある:
#include <iostream>
#include <bitset>
int main()
{
const auto value = char{-80};
std::cout << "value: " << (int)value << std::endl;
std::cout << "value bits: " << std::bitset<32>(value) << std::endl;
auto merged_value = uint32_t{0};
merged_value |= (value & 0x000000FF) << 24;
const auto back_value = int32_t(merged_value >> 24) & 0xFF;
std::cout << "value: " << back_value << std::endl;
std::cout << "back_value bits: " << std::bitset<32>(back_value) << std::endl;
}
"符号付き32ビット整数に格納したい。" - なぜそれに署名しなければならないのですか? –
最後にコンテナとして機能するので、符号なし32ビットにすることもできます。より具体的にするために署名しましたが、ちょうど混乱を招いたと思います。 –
これは、 'auto'ではなく正しい明示的な型を使って問題を解決したか、少なくとも単純化した別の例です。 –