Почему выводит 1?

167
10 апреля 2019, 00:40

Почему выводит 1?

long int i = -0xffffffff;
std::cout << i;
Answer 1

0xffffffff имеет тип unsigned int †.

Результат применения унарного - к unsigned типам - это 2N - x (где N - размер типа в битах). Пруф.

Так что -0xffffffff = -(unsigned int)4294967295‬ = (unsigned int)(42949672956 - 4294967295‬) = (unsigned int)1.

Когда результат преобразуется в long, он, естественно, остается единицей.

† Это верно только если размер intа - 32 бита. Принцип такой:

Если целочисленный литерал не влезает в int, то компилятор будет пробовать типы большего размера, пока один из них не подойдет: int, unsigned int, long, unsigned long, и т. п.
(Такая последовательность типов используется, если литерал без суффикса, и не десятичный. Для десятичных без суффикса unsigned ... не проверяются. Почему? - ¯\_(ツ)_/¯, пруфы и подробности здесь.)

С 32-битными intами, первым подходит unsigned int.

С 64-битными - обычный int, и итоговый ответ будет -‭4294967295.

Answer 2

Оператор унарный минус, примененный к беззнаковому типу, дает результат аналогичный вычитанию этого числа из 2 в степени (количество бит в числе).

2^32 - 0xffffffff
‭4294967296‬ - ‭4294967295‬ 
1
READ ALSO
Посчитать количество чётных чисел [закрыт]

Посчитать количество чётных чисел [закрыт]

Как сделать так, чтобы после вывода 20 рандомных чисел пиcалось есть чётные числа или нет?

182
Нужна помощь с выводом матрицы

Нужна помощь с выводом матрицы

Написал функцию создания матрицы и подсчета её определителя, но не могу написать функцию вывода матрицыВместо всех строк и столбцов вывод...

180
Ошибка &ldquo;undefined reference to `TreeNode::tree&#39;&rdquo; [дубликат]

Ошибка “undefined reference to `TreeNode::tree'” [дубликат]

На данный вопрос уже ответили:

159
Непонятный цикл

Непонятный цикл

Недавно увидел на ревью такой цикл:

147