Bạn không nên làm điều này. Nhiều kiến trúc có yêu cầu căn chỉnh dữ liệu. Ví dụ, dereferencing một con trỏ không liên kết với một ranh giới từ trên một máy SPARC, sẽ sụp đổ chương trình với một lỗi Bus (SIGBUS
).
Cách di động để chia int
của bạn vào byte là bằng cách sử dụng các hoạt động Bitwise (giả sử 8-bit byte):
uint8_t b3 = 0x12, b2 = 0x34, b1 = 0x56, b0 = 0x78;
uint32_t a;
a = (b3 << 24) | (b2 << 16) | (b1 << 8) | b0;
printf("%08X\r\n", a);
a = 0x89ABCDEF;
b3 = (a >> 24) & 0xFF;
b2 = (a >> 16) & 0xFF;
b1 = (a >> 8) & 0xFF;
b0 = a & 0xFF;
printf("%02X%02X%02X%02X\r\n", b3, b2, b1, b0);
Cùng thể phi portably đạt được với type punning các mẹo thông qua union
s, chẳng hạn như:
typedef union {
uint32_t val;
uint8_t bytes[4];
} DWORD_A;
typedef union {
uint32_t val;
struct {
unsigned b0:8;
unsigned b1:8;
unsigned b2:8;
unsigned b3:8;
};
} DWORD_B;
Tuy nhiên, kỹ thuật này dẫn đến hành vi thực hiện xác định và do đó là không được khuyến khích :
- trật tự Byte phụ thuộc vào endianness hệ thống máy chủ của.
- Việc đóng gói các trường bit không thể di chuyển được.
- Đã thêm mức độ phức tạp/chi phí do mã được tạo bởi trình biên dịch để ngăn truy cập không được điều chỉnh.
- Các vấn đề liên quan đến các triển khai không ngăn cản chúng.
Bạn đang sử dụng C hoặc C++? Mã bạn đã hiển thị không hợp lệ cho cả hai. Và bạn có ý nghĩa gì bởi "' char' không được định nghĩa cho hoạt động byte "? –
Không có cách nào đúng để thực hiện việc này; những gì bạn đang làm gây ra hành vi không xác định. –
Tôi không biết tại sao điều này lại bị giảm giá. Ngay cả khi mục đích có vẻ tanh, câu hỏi là hợp pháp. –