Инструкции

Справочный раздел

В этом разделе Вы найдетё инструкции, справочники, и всевозможные хелпы по использованию программного обеспечения.

Разделы инструкций

В сети

Пользователей: 153
Из них просматривают:
Аналоги: 62. Даташиты: 50. Инструкции: 4. Новости: 7. Остальное: 3. Партнёры: 1. Программы: 1. Производители: 1. Профиль пользователя: 7. Торрент: 1. Форум: 16.
Участников: 2
Гостей: 151

Google , Яндекс , далее...
Рекорд 3921 человек онлайн установлен 06.03.2026.

Партнёры


Партнёры

Новые объявления

В настоящее время нет объявлений.
Оглавление

Тип результата выражения

Выражения могут состоять из операндов различных типов, например, не возбраняется осуществлять суммирование переменных типа char и long, double и unsigned int и т.д. И результат этих вычислений так же может быть присвоен переменной любого типа. Как же ведет себя компилятор в этом случае?
Рассмотрим следующий пример:

int xl = 20000, x2 = 15;

long res;


res = xl * x2;

     
Переменной res (длинное целое) присваивается результат произведения двух чисел (int), значения переменных укладываются в допустимые диапазоны, ожидается, что значение res будет 300000. Однако, это ошибочное предположение.


Стандартом Си определено, что тип результата выражения определяется по набольшему типу входящего в него операнда, т.е. в данном случае результат х1 * х2 будет иметь тип int. Разумеется, произведение чисел вызовет переполнение результата, и все, что «не влезло» в размер, будет отброшено, т.е. в результате произведение будет равно -27680.

 

Такой странный результат получился из-за несоответствия типа результата выражения и типа операндов. Чтобы получить верный результат, нужно использовать один из операндов типа long:

 

res = (long)xl * х2;

// или так

res = xl * (long)х2;

 
Такая запись показывает, что компилятор должен воспринимать операнд х1, как число типа long. Принудительное указание в круглых скобках нового типа для выражения называется явным преобразованием или приведением типа. Ошибкой будет попытка задать тип для результата всего выражения:

 
res = (long) (xl * х2) ;

 
Такая запись ничем не отличается от первоначальной и даст неверный результат (т.к. в этой записи явно указано то преобразование, которое компилятор и так делает автоматически).

 
Компилятор всегда приводит автоматически типы всех операндов в выражении к наибольшему типу, т.е. от меньшего типа к большему. Важно помнить, что если в выражении все операнды типа char, то они будут приведены к типу int, если нет явного преобразования типов. При помощи приведения типа программист может изменить его поведение, что чревато большими ошибками.

 

Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.

Разное

Интересно

Хранение мелких крепежных деталей. Для любого радиолюбителя когда-то возникает необходимость иметь какое-то количество - болтиков, винтиков, шайб. Это набора вполне достаточно для любого крепежа. А вот хранить это все - в одном месте - можно в баночках из-под растворимого кофе. В баночках - на 50 гр или 25 чашек. В каждую такую баночку вмещается 3 коробочки из-под монпасье (леденцов). В каждой коробочке из-под леденцов можно хранить достаточное колическо деталей мелкого крепежа. На банке сделать надпись - допустим, М3. Винты, шайбы, гайки.