<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 134,comments - 22,trackbacks - 0

    網(wǎng)上流行的一份C++筆試題目中有這樣一個(gè)題目(最初出處未知,從google或者baidu可搜索到多出來(lái)源)

    10. 以下兩條輸出語(yǔ)句分別輸出什么?[C++]
    float a = 1.0f;
    cout << (int)a << endl;
    cout << (int&)a << endl;
    cout << boolalpha << ( (int)a == (int&)a ) << endl; //
    輸出什么?

    float b = 0.0f;
    cout << (int)b << endl;
    cout << (int&)b << endl;
    cout << boolalpha << ( (int)b == (int&)b ) << endl; //
    輸出什么?

    這個(gè)題目涉及float在計(jì)算機(jī)中的存儲(chǔ)問(wèn)題,IEEE 754的標(biāo)準(zhǔn)就是描述的這個(gè)問(wèn)題。如果這個(gè)題目放在筆試的時(shí)候應(yīng)該比面試的時(shí)候容易多了。

    這個(gè)題目的幾個(gè)答案為110653532160x3f800000H),false00true。如果你已完美的答出這六個(gè)答案,就可以忽略后面的內(nèi)容。

    1.我們先來(lái)看一下IEEE 754中關(guān)于floatdouble的存儲(chǔ)規(guī)范。

    無(wú)論是單精度還是雙精度在存儲(chǔ)中都分為三個(gè)部分:

    1. 符號(hào)位(Sign) : 0代表正,1代表為負(fù)

    2. 指數(shù)位(Exponent:用于存儲(chǔ)科學(xué)計(jì)數(shù)法中的指數(shù)數(shù)據(jù),并且采用移位存儲(chǔ)

    3. 尾數(shù)部分(Mantissa):尾數(shù)部分

    其中float的存儲(chǔ)方式如下圖所示:

     

    指數(shù)部分(E) 占用8-bit的二進(jìn)制數(shù),可表示數(shù)值范圍為0255。 但是指數(shù)應(yīng)可正可負(fù),所以IEEE規(guī)定,此處算出的次方須減去127才是真正的指數(shù)。所以float的指數(shù)可從 -126128.

    尾數(shù)部分(M)實(shí)際是占用24-bit的一個(gè)值,由于其最高位始終為 1 ,所以最高位省去不存儲(chǔ),在存儲(chǔ)中只有23-bit

    符號(hào)位:s 通過(guò)(-1)的s次冪來(lái)表示正負(fù)號(hào)。

    而雙精度的存儲(chǔ)方式為:

    double

    1bit(符號(hào)位)

    11bits(指數(shù)位)

    52bits(尾數(shù)位)


    我們把EM從二進(jìn)制串表示轉(zhuǎn)換為真正的em
    這里要涉及到規(guī)格化(normalized)”非規(guī)格化(denormalized)”規(guī)格化與否全看指數(shù)E下面分三種情況討論E,并分別計(jì)算em:
    1、規(guī)格化:當(dāng)E的二進(jìn)制位不全為0,也不全為1時(shí),N為規(guī)格化形式。此時(shí)e被解釋為表示偏置(biased)形式的整數(shù),e值計(jì)算公式如下圖所示:

     

    上圖中,|E|表示E的二進(jìn)制序列表示的整數(shù)值,例如E"10000100",|E|=132,e=132-127=5 k則表示E的位數(shù),對(duì)單精度來(lái)說(shuō),k=8,bias=127,對(duì)雙精度來(lái)說(shuō),k=11,bias=1023

    此時(shí)m的計(jì)算公式如下圖所示:

     

    標(biāo)準(zhǔn)規(guī)定此時(shí)小數(shù)點(diǎn)左側(cè)的隱含位為1,那么m=|1.M|。如M="101",則|1.M|=|1.101|=1.625, m=1.625

    2、非規(guī)格化:當(dāng)E的二進(jìn)制位全部為0時(shí),N為非規(guī)格化形式。此時(shí)em的計(jì)算都非常簡(jiǎn)單。


    注意,此時(shí)小數(shù)點(diǎn)左側(cè)的隱含位為0   為什么e會(huì)等于(1-bias)而不是(-bias),這主要是為規(guī)格化數(shù)值、非規(guī)格化數(shù)值之間的平滑過(guò)渡設(shè)計(jì)的。后文我們還會(huì)繼續(xù)討論。有了非規(guī)格化形式,我們就可以表示0了。把符號(hào)位S1,其余所有位均置0后,我們得到了 -0.0; 同理,把所有位均置0,則得到 +0.0。非規(guī)格化數(shù)還有其他用途,比如表示非常接近0的小數(shù),而且這些小數(shù)均勻地接近0,稱為逐漸下溢(gradually underflow)”屬性。
    3、特殊數(shù)值:當(dāng)E的二進(jìn)制位全為1時(shí)為特殊數(shù)值。此時(shí),若M的二進(jìn)制位全為0,則n表示無(wú)窮大,若S1則為負(fù)無(wú)窮大,若S0則為正無(wú)窮大; M的二進(jìn)制位不全為0時(shí),表示NaN(Not a Number),表示這不是一個(gè)合法實(shí)數(shù)或無(wú)窮,或者該數(shù)未經(jīng)初始化。

    2.問(wèn)題的解答

    對(duì)于1.0f這個(gè)數(shù)字,我們應(yīng)該如何表示?按照上面的規(guī)則可以得到,符號(hào)位為0,指數(shù)位為1270x7F),尾數(shù)部分M應(yīng)該為全0。因此它在計(jì)算機(jī)中的存儲(chǔ)就是0x3F800000H

    cout << (int)a << endl;

    a從浮點(diǎn)數(shù)轉(zhuǎn)換為整數(shù),由于1.0f能夠使用32bits完整的表示,沒有舍入誤差,因此會(huì)輸出整數(shù) 1
    cout << (int&)a << endl;

    a里面的內(nèi)容轉(zhuǎn)換為整數(shù)地址,因此編譯器會(huì)直接浮點(diǎn)數(shù)的32位表示直接輸出,,即0x3f800000h10進(jìn)制表示。

    對(duì)于0.0f這個(gè)特殊的表示上面已經(jīng)提到了,它在內(nèi)存中的存儲(chǔ)就是全0,因此直接把浮點(diǎn)數(shù)轉(zhuǎn)換為整數(shù)還是直接把浮點(diǎn)數(shù)的表示轉(zhuǎn)化為整數(shù)地址結(jié)果都是0

    正如上面提到的一樣,浮點(diǎn)數(shù)-0的表示和+0的表示是不同的,-0在內(nèi)存中的表示為0x80000000H

    最后再轉(zhuǎn)載一點(diǎn)關(guān)于long double的知識(shí),我也沒有自己深入。

    3.擴(kuò)展雙精度格式(long double)

    擴(kuò)展雙精度格式(SPARC 結(jié)構(gòu)計(jì)算機(jī))

    4倍精度浮點(diǎn)環(huán)境符合IEEE關(guān)于擴(kuò)展雙精度格式的定義。該浮點(diǎn)環(huán)境的4倍精度浮點(diǎn)格式共128位,占4個(gè)連續(xù)32位字,包含3個(gè)構(gòu)成字段:112位的小數(shù)f15位的偏置指數(shù)e,和1位的符號(hào)s。將這4個(gè)連續(xù)的32位字整體作為一個(gè)128位的字,進(jìn)行重新編號(hào)。其中0110位包含小數(shù)f112126位包含偏置指數(shù)e;第127位包含符號(hào)位s。如圖3所示

    SPARC結(jié)構(gòu)計(jì)算機(jī)中,地址最高的32位字存放小數(shù)的32位最低有效位,即f[31:0];但是在PowerPC結(jié)構(gòu)計(jì)算機(jī)中,卻是地址最低的32位字存放這些位

    緊鄰的兩個(gè)32位字(在SPARC機(jī)中向下計(jì)算,在PowerPC機(jī)中向上計(jì)算)分別存放f[63:32]f[95:64]

    最后一個(gè)字的第015位存放小數(shù)的最高16,f[111:96]。其中第0位存放該16位的最低有效位,第15位存放整個(gè)小數(shù)f的最高有效位。第1630位存放15位的偏置指數(shù)e,其中第16位存放偏置指數(shù)的最低有效位,第30位存放它的最高有效位。最高位,第31位存放符號(hào)s

    擴(kuò)展雙精度格式(Intel x86結(jié)構(gòu)計(jì)算機(jī))

    該浮點(diǎn)環(huán)境雙精度擴(kuò)展格式符合IEEE雙精度擴(kuò)展格式的定義。該浮點(diǎn)環(huán)境的擴(kuò)展雙精度格式共80位,占3個(gè)連續(xù)32位字,包含四個(gè)構(gòu)成字段:63位的小數(shù)f1位顯式前導(dǎo)有效位(explicit leading significand bitj15位偏置指數(shù)e,和1位符號(hào)位s。將這3個(gè)連續(xù)的32位字整體作為一個(gè)96位的字,進(jìn)行重新編號(hào)。其中063包含63位的小數(shù)f,第63位包含前導(dǎo)有效位j6478位包含15位的偏置指數(shù)e,最高位第79位包含符號(hào)位s

    Intel結(jié)構(gòu)系計(jì)算機(jī)中,這些字段依次存放在十個(gè)連續(xù)的字節(jié)中。但是,由于 UNIX  System V Application Binary Interface Intel 386 Processor Supplement (Intel ABI) 要求雙精度擴(kuò)展參數(shù),從而占用堆棧中3個(gè)相連地址的32位字,其中最高一個(gè)字的高16位未被使用

    地址最低的32位字存放小數(shù)f的低32位,即f[31:0]。其中第0位存放整個(gè)小數(shù)f的最低有效位LSB 31位存放小數(shù)低32位的最高有效位MSB

    地址居中的32位字,第030位存放小數(shù)f31位最高位,即f[62:32]。其中第0位存放31位最高小數(shù)位的最低有效位LSB,第30位存放整個(gè)小數(shù)的最高有效位,地址居中的32位字的最高位第31位存放顯式的前導(dǎo)有效位j

    地址最高32位字里,第014位存放15位的偏置指數(shù)e,第0位存放偏置指數(shù)的最低有效位LSB,第14位存放最高有效位MSB,第15位存放符號(hào)位s。雖然地址最高的32位字的高16位在Intel x86結(jié)構(gòu)系列機(jī)種未被使用,但他們對(duì)符合Intel ABI的規(guī)定來(lái)說(shuō),是必需的

     原文地址 http://blog.csdn.net/abortexit/archive/2009/06/22/4288279.aspx
    posted on 2009-12-10 15:51 何克勤 閱讀(400) 評(píng)論(0)  編輯  收藏 所屬分類: C/C++
    主站蜘蛛池模板: 亚洲精品WWW久久久久久| 女人张开腿给人桶免费视频 | 一进一出60分钟免费视频| 一级毛片aaaaaa视频免费看| 最新久久免费视频| 18禁美女黄网站色大片免费观看 | 丁香五月亚洲综合深深爱| 亚洲av永久无码精品古装片| 亚洲理论片在线观看| 亚洲另类无码一区二区三区| 一级毛片完整版免费播放一区| 一区二区免费视频| 免费涩涩在线视频网| 中文字幕中韩乱码亚洲大片| 亚洲日本中文字幕| 亚洲国产区男人本色| 福利免费在线观看| 日韩免费一区二区三区在线| 亚洲av成人一区二区三区在线观看 | 国产午夜精品理论片免费观看| 99re6在线精品视频免费播放 | 毛片a级毛片免费播放下载| 人人狠狠综合久久亚洲高清| 亚洲综合视频在线| 国产精品久久亚洲一区二区| 亚洲免费人成在线视频观看| 在线观看无码的免费网站| 亚洲中文字幕无码永久在线| 亚洲伊人久久大香线焦| 好吊色永久免费视频大全| 无码国产精品一区二区免费 | 亚洲综合久久1区2区3区| 精品久久久久亚洲| 99热在线观看免费| 免费一级毛片正在播放| 亚洲美女在线观看播放| 一级中文字幕免费乱码专区| 91精品免费在线观看| 久久91亚洲人成电影网站| 亚洲精品无码av片| 免费A级毛片av无码|