整型和浮点型的区别_浮点整型强转的一个题目解析
生活随笔
收集整理的這篇文章主要介紹了
整型和浮点型的区别_浮点整型强转的一个题目解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
有這么一個題目:
int main(){
int *p, a = 10;
float *q;
p = &a;
q = (float *)p;
printf("%f\n", *q);
return 0;
}
問打印輸出結果是什么。
知道答案很簡單,找個編輯器敲一下,編譯運行一下便好,結果是0。
為什么是0呢?這里涉及到浮點型的計算機表示方式,如下圖
總共32bit,a = 10相當于0x0000000a,對于float保留6位小數點來說就近似于0了。
這個題目最大的作用在于告訴考試者,浮點地址直接強轉整型地址是不符合預期的。由于浮點效率極低,我們有規范要求產品代碼禁止用浮點以及用浮點作入參的庫函數,但對測試框架來說可沒有這個限制,這個知識點還是有點用處的。
這里面衍生出來兩個問題:
怎樣正確地把int轉換為float?很簡單:
float c = b;
2. 我們一般也不會這么強轉不是嗎?
我們一般是對結構體進行操作,如果結構體包含浮點型,一定要保證收發雙方對于同一個字段的處理使用的是相同的類型。換句話說,結構體賦值方賦值之后,中間可以經過一系列的強轉,但最終在使用float字段的時候,要保證用的是float的類型。比如下面這段代碼沒有問題:
typedef struct Hello{
float a;
int b;
}Hello;
void func(char *a)
{
float *c = (float *)a;
Hello *b = (Hello *)a;
printf("%f %d", *c, b->b);
}
int main()
{
Hello hello;
hello.a = 2.5;
hello.b = 10;
func((char *)&hello);
return 0;
}
除非在最終使用方把a強轉成了整型,否則不會出問題。這應是一個規則:強轉前后的數據生成方必須與數據使用方使用相同的類型解釋字段。但是如果你沒遵循這個規則,現在還沒有聽說過哪個工具能識別出來這個問題,所以需要開發者謹慎編碼。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的整型和浮点型的区别_浮点整型强转的一个题目解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python定时发送邮件_Python3
- 下一篇: chmod命令用法_关于chmod(变更