Ви не увійшли.
Если один из операндов будет с типом L, то и результат будет правильным. Не?
Ну да! И это не логично, но так есть. Для совместимости снизу вверх, наверное.
По уму != по стандарту. Ибо умы у всех разные.)
Как я понимаю 200 * 100 * 4 = 80000, но т.к. операнды int, то и результат с учётом переполнения будет 14464 (+ 65536).
Если один из операндов будет с типом L, то и результат будет правильным. Не?
Бред. Или баг.
Бардак в прочтении стандартов. По уму вы написали правильно. У GCC еще и не такие фокусы бывают. Константные операции по умолчанию должны быть типа int, длинные нужно объявлять явно. ISO/IEC 9899:201x Committee Draft — April 12, 2011 N1570 6.6 Constant expressions
В случае смешивания типов операндов всегда явно прописывайте в каком формате проводить вычисление:
long res = (float) 10 / 3 * 1000;
Компилятор по первому операнду определяет к какому типу приводить все операнды. В данном случае все приводим к флоату, поэтому получаем 3333. Без указания (float) получили бы 3000, потому что 10 поделилось бы на 3 как целое, получили 3 и умножив на 1000 результат 3000.
Сори, погорячился.
Правильный ответ:
long t = 200 * 100 *2L;
Компилер не смотря на тип переменной приемника значения не понимает и вычисляет промежуточные значения как 16-битные, в результате переполнение и остаток как результат.
Будьте внимательны при вычислениях с большими числами, особенно когда промежуточные значения большие, а конечный результат помещается в меньшую битность. Порежет.
Всем доброго дня!
Arduino Mega2650 rev3 (clone)
Натолкнулся на такую штуку: не правильно умножает. Вынес в отдельный скетч. Подтвердилось. Прошу проверить на своих девайсах.
void setup() {
Serial.begin(9600);
long t=200*100*4;
Serial.println(t);
t=80000;
Serial.println(t);
}
void loop() {
}
На сериал-мониторе:
14464
80000
Бред. Или баг.