#cpp
Сколько оперативной памяти должен занимать тип type, чтобы в результате следующего фрагмента кода переменная c хранила –32767? type a = 32767; type b = 1; type c = 1; c = a + b; Как решается такое задание?
Ответы
Ответ 1
Такое задание не имеет конкретного решения. В языке С++ не существует фундаментальных или стандартных библиотечных типов, которые давали бы результат -32767 при применении бинарного оператора + к объектам, хранящим значения 32767 и 1. Если же речь идет о некоем нестандартном типе, то ответ может быть практически любым. В языке С++ знаковое переполнение вызывает неопределенное поведение. То есть сумма двух положительных целых значений не может дать отрицательное значение, за исключением небольшой лазейки: если "переполнение" происходит не во время суммирования, а во время преобразования типов (от более широкого знакового целого к более узкому), то поведение не является неопределенным, а является определяемым реализацией. Таким образом, в рамках некоторой реализации, если type - это некий знаковый тип, более узкий , чем int, в диапазон которого не входит значение 32768, но при этом 32768 входит в диапазон типа int, то операнды в выражении a + b будет подвергнуты integral promotions до типа int, выражение будет вычислено в рамках типа int (без переполнения) и затем преобразовано обратно к type. При обратном преобразовании произойдет "переполнение" с результатом, определяемым реализацией. Теоретически, в какой-то реализации может получиться и -32767, в какой-то - 12345, в какой-то - еще что-нибудь... Но это все выходит далеко за рамки вопроса о том, сколько памяти должен занимать тип type.
Комментариев нет:
Отправить комментарий