Tôi đang cố gắng tạo một hàm trong C trên Windows lấy đầu vào là gấp đôi (8 byte) và trả về một hàm gấp đôi khác nhưng được sắp xếp lại, tức là đầu vào là B7...B0 và đầu ra là B0...B7. gây ra lỗi cho tôi khi xử lý dữ liệu int và double.
Tôi đã cân nhắc lấy giá trị đầu vào và tạo mặt nạ với byte cấp cao (0xFF), do đó tách 8 byte tạo nên giá trị đầu vào kép, sau đó ghép chúng theo thứ tự khác với thứ tự đầu vào để có được đầu ra kép của tôi như Yêu cầu của tôi được đặt hàng nhưng nó không hoạt động.
Mã này như sau:
ordena_lineal kép (tuyến tính kép)
{
// Recibo B7...B0 và devuelvo B0...B7
uint8_t B0,B1,B2,B3,B4,B5,B6,B7;
tuyến tính kép_cuối cùng;
B0 = tuyến tính&&0xFF;
B1 = (tuyến tính>>8)&&0xFF;
B2 = (tuyến tính>>8*2)&&0xFF;
B3 = (tuyến tính>>8*3)&&0xFF;
B4 = (tuyến tính>>8*4)&&0xFF;
B5 = (tuyến tính>>8*5)&&0xFF;
B6 = (tuyến tính>>8*6)&&0xFF;
B7 = (tuyến tính>>8*7)&&0xFF;
tuyến tính_cuối = (B7 | (B6 << 8) | (B5 << 8*2) | (B4 << 8*3) | (B3 << 8*4) | (B2 << 8*5) | (B1 << 8*6) | (B0 << 8*7))
trả về tuyến tính_cuối cùng;
}
Toán tử bitwise là bất hợp pháp trên các loại dấu phẩy động. Ngoài ra, khi bạn phân bổ lại các byte đã dịch chuyển tuyến tính_cuối cùng
, bạn gán biểu thứcgiá trị, thay vì nóthể hiện.
Bạn cần sử dụngunion
để thực hiện hành động bạn muốn.
liên kết double_bytes {
đôi d;
uint8_t b[sizeof(double)];
};
ordena_lineal kép (tuyến tính kép)
{
liên kết double_bytes src, dst;
src.d = tuyến tính;
for (int i = 0; i < sizeof(double); i++) {
dst.b[sizeof(double) - 1 - i] = src.b[i];
}
trả về dst.d;
}
Điều này cho phép bạn truy cập gấp đôi
Biểu diễn đối tượng và thực hiện đặt bí danh theo cách tuân thủ tiêu chuẩn.
Tôi là một lập trình viên xuất sắc, rất giỏi!