簡體   English   中英

C 語言 - 指針和強制轉換

[英]C language - Pointers and Cast

我知道指針是如何工作的,但是我在用指針理解這個轉換時遇到了一些麻煩。

float f;
scanf("%f", &f);
unsigned int x = *(unsigned int*)&f;

有人可以解釋一下這是如何工作的嗎?

unsigned int x = *(unsigned int*)&f;

基本上意味着“獲取f的地址,假裝它是unsigned int而不是float的地址,然后取消引用結果。

它基本上是在嘗試將位從f復制到x而不進行任何類型轉換。

正如評論中提到的,這違反了一個被稱為“ 嚴格別名規則”的規則,並且這樣做的行為是undefined 可能會按預期工作。 它可能不會。

只是對@John Bode 的回答的補充,嘗試(也許調試)以下代碼以使事情變得清晰。

就像,看着相同的位模式;

  1. 戴着一副float的眼鏡,
  2. 戴着int眼鏡。
#include <stdio.h>
#include <stdlib.h>

void printBits(int k) {
    char bitStr[33];

    // put a string terminator at end of string
    bitStr[32] = '\0';

    for (int i = 0; i < 32; i++) {
        if (k & 1) {
            bitStr[31 - i] = '1'; // if 32nd bit is 1
        }
        else {
            bitStr[31 - i] = '0'; // if 32nd bit is 0
        }

        k = k >> 1; // shift all bits 1 bit right, dropping the right most (32nd) bit
    }

    printf("%s", bitStr);
    return;
}

int main()
{
    float f = 1.0f;
    int i = *(int *)&f;

    printf("bit pattern ");
    printBits(*(int *)&f);
    printf(" equals to %f in float\n", f);

    printf("bit pattern ");
    printBits(i);
    printf(" equals to %d in integer\n", i);

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM