Арифметические действия с разными типами данных.

Илья МГУ
Offline
Зарегистрирован: 18.03.2014

Какой тип данных  получится, если произвести такое арифметическое действие:

  Val_1=micros()-Val_2;

Где Val_1 была объявлена как "int", а Val_2 была объявлена как "unsigned long"

Интересут тип данных полученного результата.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Илья МГУ пишет:

Какой тип данных  получится, если произвести такое арифметическое действие:

  Val_1=micros()-Val_2;

Где Val_1 была объявлена как "int", а Val_2 была объявлена как "unsigned long"

Интересут тип данных полученного результата.

Что Вы понимаете под "полученным результатом". Здесь у Вас две операции: вычитание и присваивание, которые выполняются именно в таком порядке (сначала вычитание, потом присваивание).

Результат какой из этих двух операций Вас интересует?

Илья МГУ
Offline
Зарегистрирован: 18.03.2014

Если было в такой последовательности: Присваивание, потом вычитание. Меняется ли тип Val_1

после вычитания?

int Val_1;
unsigned long Val_2;

Val_1=micros()-Val_2;

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Илья МГУ пишет:
Если было в такой последовательности: Присваивание, потом вычитание.

Этой фразу я не понял. Последовательность операций я Вам написал.

Илья МГУ пишет:
Меняется ли тип Val_1 после вычитания?

С какого перепугу? Если переменная описана каким-то типом, то поменять это невозможно (не в этом языке).

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Илья МГУ пишет:

 Меняется ли тип Val_1

после вычитания?

Вы тупой или учебник программирования в шлоле выменяли на порножурнал?

Тип Val_1 Вы же сами описали как int, КАК ОН МОЖЕТ МЕНЯТЬСЯ??????

--------------------

Правила преобразования типов: (по памяти, не стал гуглить, уж простите, но это "таблица умножения"):

при арифметических операциях тип операнда преобразуется к "большему"

char->int->long->float->double. Знаковый к беззнаковому. Есть тонкости, которые вам точно не нужны, просто не поймете.

При присваивании, если возможно, значение сохраняется, если нет - обрезаестя лишнее.

В Вашем случае - обрезается 2 старших байта у ulong, Остается два байта. Они будут интерпретированы, в соотвтетствии с типом переменной:

если беззнаковое - то правильно, если знаковое, то число, большее 32767,  будет интерпретироваться, как отрицательное.

Илья МГУ
Offline
Зарегистрирован: 18.03.2014

ЕвгенийП пишет:
С какого перепугу? Если переменная описана каким-то типом, то поменять это невозможно (не в этом языке).

Спасибо! Я об этом и спрашивал. В широко растиражированной инструкции http://arduino.ua/ru/prog/Arithmetic это в явной форме не утверждается.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Илья МГУ пишет:

В широко растиражированной инструкции http://arduino.ua/ru/prog/Arithmetic это в явной форме не утверждается.

Так надо читать широко растиражированные учебники С и С++. Там это утверждается в явном виде.