*rust* 0 11 ноября, 2011 Опубликовано 11 ноября, 2011 · Жалоба Добрый день! unsigned long total = 0; //32bit unsigned int part1 = 0xAABB; //16bit unsigned int part2 = 0xCCDD; //16bit total = ((part1 << 16) + part2); Результат получается total = 0x0000CCDD; При компиляции выдает сообщение, что слишком большой сдвиг. Если вместо 16 поставить 8, все нормально. Почему не выходит сдвинуть больше 8-ми разрядов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 11 ноября, 2011 Опубликовано 11 ноября, 2011 · Жалоба Добрый день! unsigned long total = 0; //32bit unsigned int part1 = 0xAABB; //16bit unsigned int part2 = 0xCCDD; //16bit total = ((part1 << 16) + part2); Результат получается total = 0x0000CCDD; При компиляции выдает сообщение, что слишком большой сдвиг. Если вместо 16 поставить 8, все нормально. Почему не выходит сдвинуть больше 8-ми разрядов? total = (((long)part1 << 16) + part2); Или нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
*rust* 0 11 ноября, 2011 Опубликовано 11 ноября, 2011 · Жалоба Эх... преобразование типов! Да, помогло, спасибо! :a14: :bb-offtopic: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 11 ноября, 2011 Опубликовано 11 ноября, 2011 · Жалоба При компиляции выдает сообщение, что слишком большой сдвиг.Правильно говорит Почему не выходит сдвинуть больше 8-ми разрядов?На самом деле можно в вашем случае хоть на 15 разрядов. Причина - правила неявного приведения целочисленных типов (integer promotion rules). int в MSP430 имеет разрядность 16 бит. См. по ссылке 1.3.2. Преобразования при вычислении выражений Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться