переносимое преобразование знаковых и беззнаковых байтов, C++

StackOverflow https://stackoverflow.com/questions/1862453

Вопрос

Я использую приведение знака к беззнаковому байту (int8_t) для упаковки байтов.

uint32_t(uint8_t(byte)) << n

Это работает с использованием GCC в Intel Linux.Это переносимо для других платформ/компиляторов, например PowerPC?есть ли лучший способ сделать это?использование битсета в моем случае невозможно.Я использую stdint через boost

Это было полезно?

Решение

Если вы используете boost/cstdint.hpp из библиотеки Boost Integer, то да, определения типов являются переносимыми (кроссплатформенными). boost/cstdint.hpp заголовок предназначен для реализации функций C99 stdint.h в C++.

Из Документация по повышению:

Заголовок обеспечивает полезное для написания портативного кода Typedef, который требует определенной целочисленной ширины.Все Typedef находятся в повышении пространства имен.

Другие советы

Он непереносим, ​​поскольку типы uint32_t и uint8_t не являются частью стандарта C++.Все подобные манипуляции по своей сути зависят от реализации.

На практике да, скорее всего, он будет работать на большинстве других платформ, с которыми вы сталкиваетесь (особенно если на него портирован Boost).Однако если вы записываете эти упакованные значения в файлы или сетевые сокеты, вам придется иметь дело с порядком байтов (в вашем примере PowerPC имеет обратный порядок байтов, а у Intel — прямой порядок байтов).В этом отношении код будет вести себя по-разному на разных аппаратных архитектурах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top