Всем привет, столкнулся со странной проблемой, заключается в том, что при попытке объединения двух 16-битных значений в одно 32-битное значение с использованием операции сдвига и побитовых операций, объединения не происходит. Вместо ожидаемого корректного значения, результат операции содержит только младшую часть переменной.
Проблема возникает как при использовании встроенного компилятора, так и при включенном LTO.
просто микроконтроллер установленный в тестовый образец платы, если интересует
спасибо помогло! но что то странно в других местах кода работает при 16 битной переменной
Может это зависит от настроек. Я помню из прежних обсуждений, что по умолчанию при вычислениях производится привидение к int. Проверил у себя в Atmel\Studio\7.0, сдвиг байта происходит нормально, пока не выходит за пределы int
Ой, это очень непросто. Оно-то да, всё приводится к int, но … тут были обсуждения совершенно неочевидных ошибок из-за таких сдвигов. Сейчас я уже убегаю, но, завтра, если интересно, поищу.
В любом случае, это реально непросто и там масса нюансов. Лучше привести ручками и всегда контролировать ситуацию.
В любых перед сдвигом, если операнд короче int, он преобразуется к int, но там порой неочевидные ошибки возникают. Архат, помнится, долго доказывал, что компилятор неправильный, потом, когда его ткнули в стандарт, стал доказывать, что язык неправильный.