1樓:匿名使用者
從儲存結構和演算法上來講,double和float是一樣的,不一樣的地方僅僅是float是32位的,double是64位的,所以double能儲存更
高的精度。
任何資料在記憶體中都是以二進位制(0或1)順序儲存的,每一個1或0被稱為1位,而在x86cpu上一個位元組是8位。比如一個16位(2
位元組)的short int型變數的值是1000,那麼它的二進位制表達就是:00000011 11101000。由於intel cpu的架構原因,它是按位元組倒
序儲存的,那麼就因該是這樣:11101000 00000011,這就是定點數1000在記憶體中的結構。
目前c/c++編譯器標準都遵照ieee制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法,用符號、指數和
尾數來表示,底數定為2——即把一個浮點數表示為尾數乘以2的指數次方再添上符號。下面是具體的規格:
````````符號位 階碼 尾數 長度
float 1 8 23 32
double 1 11 52 64
臨時數 1 15 64 80
由於通常c編譯器預設浮點數是double型的,下面以double為例:
共計64位,摺合8位元組。由最高到最低位分別是第63、62、61、……、0位:
最高位63位是符號位,1表示該數為負,0正;
62-52位,一共11位是指數位;
51-0位,一共52位是尾數位。
按照ieee浮點數表示法,下面將把double型浮點數38414.4轉換為十六進位制**。
把整數部和小數部分開處理:整數部直接化十六進位制:960e。小數的處理:
0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……
實際上這永遠算不完!這就是著名的浮點數精度問題。所以直到加上前面的整數部分算夠53位就行了(隱藏位技術:最高位的1
不寫入記憶體)。
如果你夠耐心,手工算到53位那麼因該是:38414.4(10)=1001011000001110.0110101010101010101010101010101010101(2)
科學記數法為:1.001……乘以2的15次方。指數為15!
於是來看階碼,一共11位,可以表示範圍是-1024 ~ 1023。因為指數可以為負,為了便於計算,規定都先加上1023,在這裡,
15+1023=1038。二進位制表示為:100 00001110
符號位:正—— 0 !
合在一起(尾數二進位制最高位的1不要):
01000000 11100010 11000001 11001101 01010101 01010101 01010101 01010101
按位元組倒序儲存的十六進位制數就是:
55 55 55 55 cd c1 e2 40
***************====
我們普遍使用的intel x86系列的cpu的pc機上執行的程式是採用little endian方式儲存資料。
以x為上面例子中的38414.4為例來說明:
問題中經int型(4個位元組)指標變數p取得x的地址後,*p的值就是從低地址開始的前四個位元組組成的int型變數:0x55555555。
再賦值給double型的y,那麼y的值就是以0x55555555為整數部分的浮點數了。
x = 100.1的情況可以在vc上檢視記憶體得到其在記憶體中的值,低地址開始的四個位元組是 66 66 66 66,所以*p = 0x66666666 = 1717986918。以%f的格式控制符列印輸出的小數部分保留6位有效數字,並且禁止以指數形式輸出浮點數,所以結果就是:
1717986918.000000
2樓:匿名使用者
2, 6, 42, 3
開始看到這個程式,我覺得明顯有問題,可是執行了下,卻極其正常。找了下資料發現,得主要是static和區域性、全域性量的作用域的問題。
注意這兩點,然後再去分析程式:
1.靜態區域性變數在程式編譯時被首次初始化,即以後的函式呼叫不再進行初始化,而是使用上次呼叫結束時的值。靜態量資料有單獨的儲存區。
2.全域性變數在整個函式有效,但是當某個區域性變數與全域性變數同名時,在該區域性變數所在域內,只有該區域性變數有效,與其同名的全域性變數無效。
在所述程式中,全域性變數i在for的外,起作用的全域性量i。
在下面的分析中1.指第一次迴圈,依此類推。
int square(int i)
main()
//1.第一次迴圈結束,i(全域性,原為0)+1,值為1
//2.第二輪迴圈結束,i(全域性)+1,是2
//3.第三輪迴圈結束,i為3
printf("%d\n", i);//輸出外部變數i,其值為迴圈 退出時的值3.
} 其實,把外部變數換個名字是一樣的效果。更容易明白。如下:
int main(int argc, char* ar**)
printf("%d\n", j);
return 0;}
3樓:吉祥弓長
1717986918.000000
跑的程式不知為什麼
4樓:匿名使用者
the (incorrect) value of x is:1717986918.000000
c語言為什麼輸出這個,c語言輸出值為1 R怎麼回事
您好,這個問題是這樣的。請您注意看 byte 是8位,所以可以表示 2 的8次方 256 個資料。取值範圍是 128 到 127 int 則不確定了。在 16 位的系統或編譯器上,可以表示 2 的 16 次方個資料。取值範圍大概是這個數除以 2 從負數到正數。在 32 位的系統或編譯器上,可以表示 ...
這個c語言題目要怎麼寫呢,請問這道c語言題目怎麼寫?
int p 申明瞭一個指標變數p,要使用 p,必須讓p指向一個記憶體單元,否則,p就是野指標你有兩種方法。棧void swap int p1,int p2 這種方法純屬蛋疼。2.堆void swap int p1,int p2 使用完p後,記得釋放p指向的記憶體,某些情況下還需將p指向null,防止...
請問這C語言程式錯在哪,請問我這C語言程式錯在哪
冬一又二分之一 首先 int a 要加分號 else下面有多條語句,應該加上 include int main int a printf input a scanf d a if a 0 a 100 printf error n else switch a 10 case 10 case 9 pri...