LINUX.ORG.RU

История изменений

Исправление KennyMinigun, (текущая версия) :

По сути ситуация в топике — UB. Однако в силу двух аспектов она будет работать как описано в топике:

  1. Машинное представление знаковых типов: сейчас наиболее часто встречается two's complement («дополнительный код»). Вот тут больше: https://en.wikipedia.org/wiki/Signed_number_representations
  2. Sign extension. Для увеличения количества бит целого числа самый значимый бит просто «растягуется» до нужной ширины

В данном случае (int)-1 в обратном коде представляется как число из битовых единиц (для 2 байт: 1111 1111 1111 1111b). Поскольку sizeof(int) < sizeof(unsigned long long), int нужно «растянуть». Соответственно, «растягивание» старшего бита будет давать число из битовых единиц. При конвертиновании в unsigned такое число будет естественно максимальным значением для данного unsigned типа.

Исправление KennyMinigun, :

По сути ситуация в топике — UB. Однако в силу двух аспектов она будет работать как описано в топике:

  1. Машинное представление знаковых типов: сейчас наиболее часто встречается two's complement («дополнительный код»). Вот тут больше: https://en.wikipedia.org/wiki/Signed_number_representations
  2. Sign extension. Для увеличения количества бит целого числа самый значимый бит просто «растягуется» до нужной ширины

В данном случае (int)-1 в обратном коде представляется как число из битовых единиц (для 4 байт: 1111 1111 1111 1111b). Поскольку sizeof(int) < sizeof(unsigned long long), int нужно «растянуть». Соответственно, «растягивание» старшего бита будет давать число из битовых единиц. При конвертиновании в unsigned такое число будет естественно максимальным значением для данного unsigned типа.

Исправление KennyMinigun, :

По сути ситуация в топике — UB. Однако в силу двух аспектов она будет работать как описано в топике:

  1. Машинное представление знаковых типов: сейчас наиболее часто встречается two's complement («дополнительный код»). Вот тут больше: https://en.wikipedia.org/wiki/Signed_number_representations
  2. Sign extension. Для увеличения количества бит целого числа самый значимый бит просто «растягуется» до нужной ширины

В данном случае (int)-1 в обратном коде представляется как число из битовых единиц (для 4 байт: 1111 1111 1111 1111b). Поскольку sizeof(int) < sizeof(unsigned long long) Соответственно, «растягивание» старшего бита будет давать число из битовых единиц. При конвертиновании в unsigned такое число будет естественно максимальным значением для данного unsigned типа.

Исходная версия KennyMinigun, :

По сути ситуация в топике — UB. Однако в силу двух аспектов она будет работать как описано в топике:

  1. Машинное представление знаковых типов: сейчас наиболее часто встречается two's complement («дополнительный код»). Вот тут больше: https://en.wikipedia.org/wiki/Signed_number_representations
  2. Sign extension. Для увеличения количества бит целого числа самый значимый бит просто «растягуется» до нужной ширины

В данном случае (int)-1 в обратном коде представляется как число из битовых единиц (для 4 байт: 1111 1111 1111 1111b) и, соответственно, «растягивание» старшего бита будет давать число из битовых единиц. При конвертиновании в unsigned такое число будет естественно максимальным значением для данного unsigned типа.