Tôi muốn diễn giải lại dữ liệu của một loại dưới dạng một loại khác theo cách di động (C99). Tôi đang không phải nói về truyền, tôi muốn một sự giải thích của một số dữ liệu nhất định. Ngoài ra, bởi xách tay Tôi có nghĩa là nó không vi phạm quy tắc C99 - Tôi làm không có nghĩa là giá trị được giải thích bằng nhau trên tất cả các hệ thống.Tái phân tích dữ liệu di động
Tôi biết 3 cách khác nhau để diễn giải dữ liệu, nhưng chỉ có hai trong số này là xách tay:
Đây không phải là cầm tay - nó phá vỡ các quy tắc nghiêm ngặt răng cưa.
/* #1 Type Punning */ float float_value = 3.14; int *int_pointer = (int *)&float_value; int int_value = *int_pointer;
này phụ thuộc nền tảng, bởi vì nó đọc một giá trị
int
từ sự kết hợp sau khi viết mộtfloat
vào nó. Nhưng nó không phá vỡ bất kỳ quy tắc C99, vì vậy mà nên làm việc (nếusizeof(int) == sizeof(float)
)./* #2 Union Punning */ union data { float float_value; int int_value; }; union data data_value; data_value.float_value = 3.14; int int_value = data_value.int_value;
nên không sao đâu, miễn là
sizeof(int) == sizeof(float)
/* #3 Copying */ float float_value = 3.14; int int_value = 0; memcpy(&int_value, &float_value, sizeof(int_value));
Câu hỏi của tôi:
- là đúng này?
- Bạn có biết các cách khác để diễn giải lại dữ liệu theo cách di động không?
Các $ float_value nên & float_value? – wildplasser
@wildplasser đã được sửa! thanks – Johannes
Giải thích lại dữ liệu cho kết quả phụ thuộc vào nền tảng. Điều này có thể hoạt động như thế nào? Ví dụ, các nền tảng khác nhau có thể đại diện cho 'float' khác nhau trong bộ nhớ. –