История изменений
Исправление KennyMinigun, (текущая версия) :
По сути ситуация в топике — UB. Однако в силу двух аспектов она будет работать как описано в топике:
- Машинное представление знаковых типов: сейчас наиболее часто встречается two's complement («дополнительный код»). Вот тут больше: https://en.wikipedia.org/wiki/Signed_number_representations
- Sign extension. Для увеличения количества бит целого числа самый значимый бит просто «растягуется» до нужной ширины
В данном случае (int)-1 в обратном коде представляется как число из битовых единиц (для 2 байт: 1111 1111 1111 1111b
). Поскольку sizeof(int) < sizeof(unsigned long long)
, int нужно «растянуть». Соответственно, «растягивание» старшего бита будет давать число из битовых единиц. При конвертиновании в unsigned такое число будет естественно максимальным значением для данного unsigned типа.
Исправление KennyMinigun, :
По сути ситуация в топике — UB. Однако в силу двух аспектов она будет работать как описано в топике:
- Машинное представление знаковых типов: сейчас наиболее часто встречается two's complement («дополнительный код»). Вот тут больше: https://en.wikipedia.org/wiki/Signed_number_representations
- Sign extension. Для увеличения количества бит целого числа самый значимый бит просто «растягуется» до нужной ширины
В данном случае (int)-1 в обратном коде представляется как число из битовых единиц (для 4 байт: 1111 1111 1111 1111b
). Поскольку sizeof(int) < sizeof(unsigned long long)
, int нужно «растянуть». Соответственно, «растягивание» старшего бита будет давать число из битовых единиц. При конвертиновании в unsigned такое число будет естественно максимальным значением для данного unsigned типа.
Исправление KennyMinigun, :
По сути ситуация в топике — UB. Однако в силу двух аспектов она будет работать как описано в топике:
- Машинное представление знаковых типов: сейчас наиболее часто встречается two's complement («дополнительный код»). Вот тут больше: https://en.wikipedia.org/wiki/Signed_number_representations
- Sign extension. Для увеличения количества бит целого числа самый значимый бит просто «растягуется» до нужной ширины
В данном случае (int)-1 в обратном коде представляется как число из битовых единиц (для 4 байт: 1111 1111 1111 1111b
). Поскольку sizeof(int) < sizeof(unsigned long long)
Соответственно, «растягивание» старшего бита будет давать число из битовых единиц. При конвертиновании в unsigned такое число будет естественно максимальным значением для данного unsigned типа.
Исходная версия KennyMinigun, :
По сути ситуация в топике — UB. Однако в силу двух аспектов она будет работать как описано в топике:
- Машинное представление знаковых типов: сейчас наиболее часто встречается two's complement («дополнительный код»). Вот тут больше: https://en.wikipedia.org/wiki/Signed_number_representations
- Sign extension. Для увеличения количества бит целого числа самый значимый бит просто «растягуется» до нужной ширины
В данном случае (int)-1 в обратном коде представляется как число из битовых единиц (для 4 байт: 1111 1111 1111 1111b
) и, соответственно, «растягивание» старшего бита будет давать число из битовых единиц. При конвертиновании в unsigned такое число будет естественно максимальным значением для данного unsigned типа.