2017-09-01 7 views
0

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; 

をさて、私はこのようなことを行いますバックvalue1merged_valueから取得したいとしましょうvalue1が正の数である限り素晴らしいですが、値が負の場合、戻り値は間違っています。例えば

value1-80であれば、その後back_value1は(back_value1int32_tあるため)、最上位ビット(正または負のビット)がビット位置7でなく31であるためにです、176であろう。

charback_value1にキャストするだけで、-80という値が返されることがわかりました。しかし、私が欲しいのは、正しい値-80back_value1back_value1int32_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; 
} 
+1

"符号付き32ビット整数に格納したい。" - なぜそれに署名しなければならないのですか? –

+0

最後にコンテナとして機能するので、符号なし32ビットにすることもできます。より具体的にするために署名しましたが、ちょうど混乱を招いたと思います。 –

+5

これは、 'auto'ではなく正しい明示的な型を使って問題を解決したか、少なくとも単純化した別の例です。 –

答えて

0

答えはということです値を元のint8_tと同じ符号のint32_tに戻すには、

のいずれかを入力する必要があります。

int8_tにキャストバック:

const auto back_value1 = int32_t(int8_t((merged_value >> 24) & 0xFF)); 

またはあなたが必要とするバイトが右シフトする前にint32_tの左端にあることを確認してください。

const auto back_value1 = merged_value /* << 0 */ >> 24; 
const auto back_value2 = merged_value <<8>> 24; 

言うまでもなく、私はお勧めしません。後者。

関連する問題