- 1
- 2
- 3
- 4
p_bmp280->calib_param.dig_P2 = (s16)(((
(s16)((s8)a_data_u8[BMP280_PRESSURE_CALIB_DIG_P2_MSB]))
<< BMP280_SHIFT_BIT_POSITION_BY_08_BITS)
| a_data_u8[BMP280_PRESSURE_CALIB_DIG_P2_LSB]);
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+142
p_bmp280->calib_param.dig_P2 = (s16)(((
(s16)((s8)a_data_u8[BMP280_PRESSURE_CALIB_DIG_P2_MSB]))
<< BMP280_SHIFT_BIT_POSITION_BY_08_BITS)
| a_data_u8[BMP280_PRESSURE_CALIB_DIG_P2_LSB]);
Требуется больше приведений
из библиотеки для датчика давления BOSH280.
PS s16 dig_P2;
greenx 21.05.2015 17:15 # 0
defecate-plusplus 21.05.2015 17:37 # 0
записано отвратительно
в теории u8 -> s8 -> s16 смысл есть преобразовывать
а на деле - только автору ведомо
ps тут мог бы быть ваш аски-динозавр
MiD 21.05.2015 18:33 # 0
https://ideone.com/eeIH4T
Stertor 21.05.2015 20:55 # 0
MiD 21.05.2015 21:11 # +3
defecate-plusplus 22.05.2015 10:55 # 0
а вот, кстати, предлагаю обсудить
C11 6.5.7 Bitwise shift operators
/4
The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits are filled with zeros. If E1 has an unsigned type, the value of the result is E1×2^E2, reduced modulo one more than the maximum value representable in the result type. If E1 has a signed type and nonnegative value, and E1×2^E2 is representable in the result type, then that is the resulting value; otherwise, the behavior is undefined.
с другой стороны
/3
The integer promotions are performed on each of the operands. The type of the result is that of the promoted left operand.
т.е. если я правильно понял стандарт, битовый сдвиг самостоятельно сделает конверсию signed char -> signed int, сделает сдвиг, а далее уже этот signed int присвоится, например, int16_t
MiD 22.05.2015 11:08 # 0