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