【问题标题】:Explaining a line of code in C - pointers and cast解释 C 中的一行代码 - 指针和强制转换
【发布时间】:2014-10-15 17:01:18
【问题描述】:

我们有一些浮点 x,我们将其转换为 i,但谁能解释一下先 &,然后是 cast,最后是 * 的深度?

int i = *(int*)&x;

【问题讨论】:

    标签: c pointers casting floating-point integer


    【解决方案1】:
    &x
    

    获取指向x的指针

    (int*)&x
    

    将该指针转换为int*,即指向int的指针

    *(int*)&x
    

    取消引用结果指针,读取变量x 的内存,就好像它是int

    在不知道x 的类型的情况下,很难说出代码的用途。最有可能的是,如果xfloat,则它被用于获取float 的二进制表示(仅通过转换为int 是不可能的,因为它会进行浮点到整数的转换)

    【讨论】:

    • 如果floatintsizeof(int) > sizeof(float) 之间存在一些对齐差异,则可能存在潜在危险。对于这种讨厌的转换,唯一安全的类型是void *(但显然这样的指针不能被取消引用)。
    • @GrzegorzSzpetkowski: char* 也是安全的
    • 请注意,除非x 已经属于intunsigned int 类型(或指向具有该类型适当成员的结构或联合),否则这将违反有效类型规则(又名严格别名)
    • 怎么样:int i = (int)floor(x);这将通过删除/截断小数部分来获得整数值。
    • @user3629249 这与获取浮点数的二进制表示有很大不同。
    【解决方案2】:
    • &x: 获取指向 x 的指针
    • (int*):将该指针转换为指向 int 的指针 - 这实际上并不转换 x
    • *:获取指针指向的值

    由于指针转换实际上并不执行类型转换,这行代码的作用是读取用于存储浮点数x 的内部位,并将这些位存储在整数i 中。基本上,这是一个 reinterpret_cast。 (reinterpret_cast 是 C++ 的一项功能,但它的作用与此 C 语法完全相同。)

    【讨论】:

      【解决方案3】:

      "&" 表示获取变量的引用。所以 &x 获得了对浮点数的引用,并且具有浮点*类型。

      (int*) 是一个演员表。因此,您正在从 float* 转换为 int*。

      最后一个“*”是为了解除对int*的引用,即获取int*的值,它是一个int。

      【讨论】:

        【解决方案4】:

        让我们分解一下

        &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
        

        假设在您的系统中,long8bytesint4bytes。所以你只得到 x 的 8 个字节中的 4 个字节。因为int 通常是 4 个字节,long 通常是 8 个字节。现在,您获得的 4 个字节中的哪一个(前 4 个或后 4 个)取决于您系统的字节序。

        有关字节序的更多信息,请阅读http://en.wikipedia.org/wiki/Endianness

        【讨论】:

        • 这是一个 64 位 int 值的假设,这是一个有风险的假设。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-14
        • 2020-08-29
        • 2020-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多