【发布时间】:2014-10-15 17:01:18
【问题描述】:
我们有一些浮点 x,我们将其转换为 i,但谁能解释一下先 &,然后是 cast,最后是 * 的深度?
int i = *(int*)&x;
【问题讨论】:
标签: c pointers casting floating-point integer
我们有一些浮点 x,我们将其转换为 i,但谁能解释一下先 &,然后是 cast,最后是 * 的深度?
int i = *(int*)&x;
【问题讨论】:
标签: c pointers casting floating-point integer
&x
获取指向x的指针
(int*)&x
将该指针转换为int*,即指向int的指针
*(int*)&x
取消引用结果指针,读取变量x 的内存,就好像它是int。
在不知道x 的类型的情况下,很难说出代码的用途。最有可能的是,如果x 是float,则它被用于获取float 的二进制表示(仅通过转换为int 是不可能的,因为它会进行浮点到整数的转换)
【讨论】:
float 和int 或sizeof(int) > sizeof(float) 之间存在一些对齐差异,则可能存在潜在危险。对于这种讨厌的转换,唯一安全的类型是void *(但显然这样的指针不能被取消引用)。
char* 也是安全的
x 已经属于int 或unsigned int 类型(或指向具有该类型适当成员的结构或联合),否则这将违反有效类型规则(又名严格别名)
&x: 获取指向 x 的指针(int*):将该指针转换为指向 int 的指针 - 这实际上并不转换 x*:获取指针指向的值由于指针转换实际上并不执行类型转换,这行代码的作用是读取用于存储浮点数x 的内部位,并将这些位存储在整数i 中。基本上,这是一个 reinterpret_cast。 (reinterpret_cast 是 C++ 的一项功能,但它的作用与此 C 语法完全相同。)
【讨论】:
"&" 表示获取变量的引用。所以 &x 获得了对浮点数的引用,并且具有浮点*类型。
(int*) 是一个演员表。因此,您正在从 float* 转换为 int*。
最后一个“*”是为了解除对int*的引用,即获取int*的值,它是一个int。
【讨论】:
让我们分解一下
&x; //this gets you the address of x
(int *)&x; //this cast the address to be pointing at an integer value
//(before it was pointing at a float value)
*(int *)&x; // now the last * dereferences that value
假设在您的系统中,long 是 8bytes,int 是 4bytes。所以你只得到 x 的 8 个字节中的 4 个字节。因为int 通常是 4 个字节,long 通常是 8 个字节。现在,您获得的 4 个字节中的哪一个(前 4 个或后 4 个)取决于您系统的字节序。
有关字节序的更多信息,请阅读http://en.wikipedia.org/wiki/Endianness
【讨论】: