У меня простая программа. Обратите внимание, что я использую целое число без знака с фиксированной шириной 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-байтовое целое.
Кажется, что побитовое не оператор (~
) выполняет подписанную интегральную продвижение, как это делают арифметические операторы. Однако левый оператор сдвига (<<
), по-видимому, способствует беззнаковому интегралу.
Я чувствую себя обязанным знать, когда компилятор что-то меняет за моей спиной. Если я правильно в своем анализе, все битовые операторы продвигают до 4 байтовых целых чисел? И почему некоторые подписываются и некоторые без знака? Я так смущен!
Изменить: Мое предположение о том, чтобы всегда получать положительные или всегда получать отрицательные значения, было неправильным. Но из-за того, что я ошибаюсь, я понимаю, что на самом деле происходит благодаря большим ответам ниже.