[英]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 的回答的補充,嘗試(也許調試)以下代碼以使事情變得清晰。
就像,看着相同的位模式;
float
的眼鏡,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.