我正在嘗試一些do和dont的類型轉換的例子。我無法理解爲什麼下面的代碼片段無法輸出正確的結果。從int,float,char,double的類型轉換
/* int to float */
#include<stdio.h>
int main(){
int i = 37;
float f = *(float*)&i;
printf("\n %f \n",f);
return 0;
}
這將打印0.000000
/* float to short */
#include<stdio.h>
int main(){
float f = 7.0;
short s = *(float*)&f;
printf("\n s: %d \n",s);
return 0;
}
這將打印7
/* From double to char */
#include<stdio.h>
int main(){
double d = 3.14;
char ch = *(char*)&d;
printf("\n ch : %c \n",ch);
return 0;
}
這將打印垃圾
/* From short to double */
#include<stdio.h>
int main(){
short s = 45;
double d = *(double*)&s;
printf("\n d : %f \n",d);
return 0;
}
這將打印0.000000
爲什麼從float
到int
的轉換會給出正確的結果,並且在明確轉換類型時所有其他轉換都會給出錯誤結果?
我不能清楚地瞭解爲什麼需要,而不是float
int i = 10;
float f = (float) i; // gives the correct op as : 10.000
但這種類型轉換的(float*)
,
int i = 10;
float f = *(float*)&i; // gives a 0.0000
什麼是上述兩種類型之間的區別蒙上?
爲什麼不能我們使用:
float f = (float**)&i;
float f = *(float*)&i;
不是'float f =(float)&i'將'i'的內存位置賦給'f'嗎? –
您正在轉換指針,而不是數值,這意味着您正在處理一種類型的對象(如'int')*,就像*它們是另一種類型的對象(例如'float')。結果是垃圾。要轉換數值,只需使用'int i = 37; float f = i;' - 或者,如果你堅持不必要的明確,'float f =(float(i);'。(所有數字類型都是隱式轉換的,因此很少需要從一個數字類型轉換爲另一個數字類型。 )('float'的範圍和精度要求不能超過16位。) –