Почему переполнение целочисленного числа со знаком в turbo c с циклическим переполнением каждый раз, когда переполнение целочисленного числа со знаком не определено?

Я много раз делал подписанное переполнение, но каждый раз с турбонаддувом. Например:

#include <stdio.h>

void main() {
  int i = 100000; 
  printf("%d", i);
  getch();
}

Результатом является -31072, что является ожидаемым результатом, если циклическое завершение выполнено. В двоичном формате 100000(dec) равен 11000011010100000, а последние 16 бит хранятся как 1000011010100000. В представлении с двумя дополнениями 1000011010100000 равно -31072.


person CJ Koirala    schedule 29.12.2016    source источник
comment
Взгляните на это. Он хорошо объясняет неопределенное поведение и, в частности, говорит о неопределенном поведении и о том, как мы иногда используем гиперболу для его описания.   -  person wally    schedule 29.12.2016


Ответы (1)


В вашем примере нет подписанных переполнений, поэтому поведение undefined отсутствует.

(Предположим, что INT_MAX меньше 100000.)

Назначение:

int i=100000;

выполняет неявное преобразование из типа long, который является типом целочисленной константы 100000, в тип int. Этот результат преобразования определяется реализацией1 (или ловушка, определяемая реализацией, является сигналом).


1(Цитируется из: ISO/IEC 9899:201x 6.3.1.3 Целые числа со знаком и без знака 3)
В противном случае новый тип является знаковым и значение не может быть представлено в нем; либо результат определяется реализацией, либо выдается сигнал, определяемый реализацией.

person 2501    schedule 29.12.2016