私は簡単なプログラムを持っています。サイズが 1 バイトの符号なし固定幅整数を使用していることに注意してください。
#include <cstdint>
#include <iostream>
#include <limits>
int main()
{
uint8_t x = 12;
std::cout << (x << 1) << '\n';
std::cout << ~x;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cin.get();
return 0;
}
私の出力は次のとおりです。
24
-13
より大きな数値をテストしたところ、オペレーター<<
は常に正の数値を返しますが、オペレーター~
は常に負の数値を返します。それから私は使用sizeof()
して見つけました...
左シフトのビット演算子 (
<<
) を使用すると、符号なしの 4 バイト整数が返されます。ビット単位の not operator(
~
) を使用すると、符号付き 4 バイト整数を受け取ります。
ビットごとの not operator( ~
) は、算術演算子のように符号付き整数昇格を行うようです。ただし、左シフト operator( <<
) は符号なし整数に昇格するようです。
コンパイラが背後で何かを変更していることを知る義務があると感じています。私の分析が正しければ、すべてのビット演算子は 4 バイト整数に昇格しますか? また、署名付きのものと署名なしのものがあるのはなぜですか? 私は困惑している!
編集:常に正の値または常に負の値を取得するという私の仮定は間違っていました。しかし、間違っていたので、以下の素晴らしい回答のおかげで、実際に何が起こっていたのか理解できます.