В последнем варианте, почему int32_t, а не long? Какая цель? Типа сэкономить на спичках? Не знаю как сделает компилятор, но чисто как это выглядит, получится два приведения типов, сначала к int32_t, потом результат к long. Это нормально?
long и int32_t разве это не одно и тоже ???
Буквы разные. Я вроде бы объяснил "но чисто как это выглядит, получится два приведения типов". long и int32_t - это разные типы. Пусть где-то они определены одинаково и занимают одинаковый объем (цитирую исходник: typedef signed long int int32_t;). Но далеко не во всех МК long === int32_t. Далеко ходить не нужно, вот для 32-битников: typedef signed int int32_t;
Что мешает написать long n = (long)a + 2; ? Либо, если нравится int32_t n = (int32_t)a + 2;. Цель какая? (уже спрашивал, но ответа не получил). Почему нужно писать разные буквы long n = (int32_t)a + 2;? Может я ошибаюсь? (Только не надо говорить, что это только для примера, название такого кода я уже не раз повторил).
Если непонятно, то, боюсь, мне не удастся объяснить.
PS Я понимаю, что бывают программисты распиз"яи, бывают педанты и прочее, потому прочитав тему каждый будет писать по-своему и грабли будут у каждого свои, се ля ви.
Этот термин и появился вследствие широкого распространения в ПО ошибок проектирования, которые разработчик не хочет (или не может) признавать ошибками.
long и int32_t разве это не одно и тоже ???
Буквы разные. Я вроде бы объяснил "но чисто как это выглядит, получится два приведения типов". long и int32_t - это разные типы. Пусть где-то они определены одинаково и занимают одинаковый объем (цитирую исходник: typedef signed long int int32_t;). Но далеко не во всех МК long === int32_t. Далеко ходить не нужно, вот для 32-битников: typedef signed int int32_t;
Что мешает написать long n = (long)a + 2; ? Либо, если нравится int32_t n = (int32_t)a + 2;. Цель какая? (уже спрашивал, но ответа не получил). Почему нужно писать разные буквы long n = (int32_t)a + 2;? Может я ошибаюсь? (Только не надо говорить, что это только для примера, название такого кода я уже не раз повторил).
Если непонятно, то, боюсь, мне не удастся объяснить.
PS Я понимаю, что бывают программисты распиз"яи, бывают педанты и прочее, потому прочитав тему каждый будет писать по-своему и грабли будут у каждого свои, се ля ви.
andriano, "багофича", есть такое слово :)
Вот-вот.
Этот термин и появился вследствие широкого распространения в ПО ошибок проектирования, которые разработчик не хочет (или не может) признавать ошибками.
берем число float с двумя знаками после запятой , умножаем на 100
напрмер float c = 25.89;
int16_t f = c * 100
получаем целое число f =2589 - тут все нормально
пытаемся вернуть число float обратно
float d = 0;
d = f/100 - и получаем 26.00 - неправильное значение , почемуто округляется
d = f * 0.01 - и получаем правильное значение 25.89
И чего тут непонятного.
В первом случае целое число f делится на целое число 100. Получается целый результат, который при присваивании преобразуется в float.
Во втором случае случае компилятор видит, что 0.01 - дробное число, поэтому результат уже после умножения получается float.
Советы дали правильные: либо d=f/100.0 , либо d=(float)f/100 (можно и так d=(float)f/100.0).
И чего тут непонятного.
а вы вопрос поняли, или поверхностно пробежали, читайте внимательно, и не только первый пост, прежде чем ответить
И чего тут непонятного.
а вы вопрос поняли, или поверхностно пробежали, читайте внимательно, и не только первый пост, прежде чем ответить
А вы ответ поняли? Из него следует, что другие посты я прочитал.
Если интересует ответ на вопрос:
получается языку c++ не свойствены законы математики?
то язык Си и контроллеры интерпретируют законы математики по-своему.
Например: школьное правило "от перемены мест слагаемых сумма не меняется" в некоторых случаях в Си и контроллерах не работает.