請問這個C語言輸出的是什麼

時間 2021-10-14 23:49:04

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...