#cpp #типы_данных #преобразование
Как в C++ происходит преобразование типов при присвоении беззнаковому типу отрицательного числа или числа не из диапазона типа?
Ответы
Ответ 1
При выполнении присваивания производится преобразование исходного значения к типу переменной-приемника. Поведение определяется правилами таких преобразований. Переполнение при преобразовании в беззнаковый целый тип из целых типов (как знаковых, так и беззнаковых) обрабатывается по правилами модульной арифметики с модулем 2^N, где N количество значащих бит в целевом беззнаковом типе. Переполнение при преобразовании в знаковый целый тип из целых типов (как знаковых, так и беззнаковых) приводит к поведению, определяемому реализацией. Реализация в том числе имеет право в таких ситуациях выкидывать сигнал. Переполнение при преобразовании в целый тип из плавающих типов приводит к неопределенному поведению. Переполнение при преобразовании в плавающий тип приводит к неопределенному поведению.Ответ 2
Данные преобразования описаны в разделе 4.7 Integral conversions стандарта C++. В этом разделе в отношении преобразования из знакового целочисленного типа в беззнаковый целочисленный тип написано 2 If the destination type is unsigned, the resulting value is the least unsigned integer congruent to the source integer (modulo 2n where n is the number of bits used to represent the unsigned type). [ Note: In a two’s complement representation, this conversion is conceptual and there is no change in the bit pattern (if there is no truncation). —end note ] Что касается преобразования в знаковый целочисленный тип, то там же написано 3 If the destination type is signed, the value is unchanged if it can be represented in the destination type (and bit-field width); otherwise, the value is implementation-defined. Если же объекты знаковых и беззнаковых целых чисел принимают участие в выражении, то сначала определяется их общий тип, чтобы вывести тип значения выражения, согласно правилам обычных арифметических преобразований. Например, согласно этим правилам если два целочисленных типа, беззнаковый и знаковый, имеют одинаковый ранг, то объект знакового типа преобразуется к беззнаковому типу. Вот пример, на который не каждый программист сможет сходу ответить. Допустим у вас на машине sizeof( long ) равняется sizeof( int ). Можно предположить, что оба эти выражения равны 4, хотя это не обязательно. И имеются следующие объявления unsigned int x = 0; long y = 0; Спрашивается: какой тип будет иметь выражение:) x + y
Комментариев нет:
Отправить комментарий