use*_*507 9 c pointers casting
我正在阅读Carmack的快速反平方根算法,并注意到这一点:
float x;
// ... //
int i = *(int*)&x;
Run Code Online (Sandbox Code Playgroud)
为什么有人会选择使用这种奇怪的铸造而不仅仅是以下?
int i = (int)x;
Run Code Online (Sandbox Code Playgroud)
ara*_*aer 28
那不一样.
int i = (int) x;将转换float为int,这将简单地截断它.
int i = *(int *) &x;将加载到i当前存储的相同位x.结果与截断完全不同x.
Lea*_*ros 15
它被称为类型双关语.它会将其解释float为int.意思是,位表示被完全复制.
这是一个潜在危险的操作,因为浮点整数的某些位表示可能是陷阱表示为整数(不是IEEE-754浮点数和2s补码整数的情况).
此外,由于根据C标准的未定义行为,它可能不再起作用.它违反了严格的别名规则.
C仅支持通过访问不同类型的变量memcpy.
这是编写操作的有效标准C方式:
int y; float x = 42.0f;
memcpy(&y, &x, sizeof(x));
Run Code Online (Sandbox Code Playgroud)
C99通过使用以下方法添加了另一种方法union:
union { int y; float x; } u = { .x = 42.0f };
int y = u.y;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
323 次 |
| 最近记录: |