Термометр https://amperka.ru/product/thermometer-lm35 В коде считываю данные (код с сайта производителя) Код (C): int val=analogRead(5);//Connect LM35 on Analog 5 int temperatureC=(500*val)>>10; Проблема: если val становится 66, то temperatureC уходит в отрицательное значение (-32) До значения val=65 все нормально temperatureC = +31, дальше абсолютное значение температуры верное, но с отрицательным знаком. Можно ли значение в цельсиях получать как-нибудь иначе чем сдвигом? Честно говоря не совсем понимаю работу сдвига (как он в отрицательные значения уводит) и смысл его применения в данном случае.
500*66 = 33 000 максисальный инт 32 767 соответственно происходит переполнение 33 000 в двоичной системе: 1000 0000 1110 1000 так как старший бит равен 1 то ты получаешь отрицательное значение затем отрицательное значение двигаешь на 10 позиций, как я понял из поведения операция сдвига не затронула знаковый бит попробуй unsigned int использовать с 65 получилось так как 65 * 500 = 32 500 0111 1110 1111 0100 и данные нормально сдвинулись
когда мы сдвигаем знаковое целое вправо, и знаковый бит введен, то старшие биты заполняются 1 т.е. 1000 0000 1110 1000 >> 10 = 1111 1111 1110 0000 = -16 368