2016-12-29 25 views
0

Я сделал подписанное переполнение много раз, но каждый раз turbo c wraparound. Например:Почему turbo c wraparound подписывает целочисленное переполнение каждый раз, несмотря на то, что подписанное целочисленное переполнение не определено?

#include <stdio.h> 

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

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

+0

Посмотрите на [это] (https://www.youtube.com/watch?v=yG1OZ69H_-o). Это хорошая работа по объяснению неопределенного поведения больше и конкретно говорит о неопределенном поведении и о том, как мы иногда используем гиперболу для ее описания. – wally

ответ

2

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

(Предполагая INT_MAX меньше, чем 100000.)

Назначение:

int i=100000; 

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


(Цитируется: ИСО/МЭК 9899: 201x 6.3.1.3 Подпись и целые числа без знака 3)
В противном случае, будет подписан новый тип и значение не может быть представлено в нем; либо результат определяется реализацией или повышается сигнал, определяемый реализацией.