Информатика и технология программирования


Преобразование типов операндов - часть 3


Второй операнд, к типу которого осуществляется приведение, на этот процесс не влияет:


long l=0x21;
unsigned d=0xFF00;
l + d ...
// 0x00000021 + 0xFF00 = 0x00000021 + 0x0000FF00 = 0x0000FF21


В данном случае производится преобразование целого обычной точности без знака (unsigned) к длинному целому со знаком (long). В процессе преобразования "удлинение" переменной d производится как беззнаковое (разряды заполняются нулями), хотя второй операнд и имеет знак. Рассмотрим еще несколько примеров.


int i; i = 0xFFFF;

Целая переменная со знаком получает значение FFFF , что соответствует -1 для знаковой формы в дополнительном коде. Изменение формы представления с беззнаковой на знаковую не сопровождается никакими действиями.


int i = 0xFFFF;
long l; l = i;

Преобразование int в long сопровождается " удлинением" переменной, что с учетом представления i со знаком дает FFFFFFFF , то есть длинное целое со значением -1 .


unsigned n = 0xFF00;
long l; l = n;

Переменная n " удлиняется" как целое без знака, то есть переменная l получит значение 0000FF00 .


int i; unsigned u;
i = u = 0xFFFF;
if (i &#62 5) ... // "Ложь"


if (u &#62 5) ... // "Истина"


Значения переменных без знака и со знаком равны FFFF или - 1 . Но результаты сравнения противоположны, так как во втором случае сравнение проводится для беззнаковых целых по их абсолютной величине, а в первом случае -путем проверки знака результата вычитания, то есть с учетом знаковой формы представления чисел.




Начало  Назад  Вперед



Книжный магазин