日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

整型和浮点型的区别_浮点整型强转的一个题目解析

發布時間:2024/10/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 整型和浮点型的区别_浮点整型强转的一个题目解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有這么一個題目:

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?很簡單:

  • int b = 10;
    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年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的整型和浮点型的区别_浮点整型强转的一个题目解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。