Метод union
в лучшем случае определяется реализацией (на практике он будет довольно надежно работать, но формат si
зависит от порядкового номера платформы).
Проблема с побитовой передачейпуть, как вы подозреваете, отрицательные числа.Отрицательное число представлено цепочкой ведущих 1.Так, например, -5 это
1111 1011
Если вы приведете это значение к int
или даже unsigned int
, оно станет
1111 1111 1111 … 1111 1011
, и все эти 1 будут заглушены слева.смещенные данные при применении ИЛИ.
Чтобы решить эту проблему, приведите char
s к unsigned char
, а затем к int
(чтобы предотвратить переполнение или даже появление возможности переполнения) доshifting:
short int stitch(char c1, char c2)
{
return ( (int) (unsigned char) c1 << 8) | (unsigned char) c2;
}
или, если вы можете изменять типы аргументов, и вы можете включить <cstdint>
,
uint16_t stitch( uint8_t c1, uint8_t c2)
{
return ( (int) c1 << 8 ) | c2;
}