我想以便携方式(C99)将一种类型的数据重新解释为另一种类型.我不是在谈论铸造,我想重新解释一些给定的数据.此外,通过便携式我的意思是它不会破坏C99规则 - 我并不是说重新解释的值在所有系统上都是相同的.
我知道3种不同的重新解释数据的方法,但其中只有两种是可移植的:
这不是便携式的 - 它打破了严格的别名规则.
/* #1 Type Punning */
float float_value = 3.14;
int *int_pointer = (int *)&float_value;
int int_value = *int_pointer;
Run Code Online (Sandbox Code Playgroud)这是依赖于平台的,因为它int在写入之后从联合中读取值float.但它不会破坏任何C99规则,所以它应该工作(如果sizeof(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;
Run Code Online (Sandbox Code Playgroud)应该没问题,只要 sizeof(int) == sizeof(float)
/* #3 Copying */
float float_value = 3.14;
int int_value = …Run Code Online (Sandbox Code Playgroud)