關於c語言中浮點數在記憶體中的儲存形式的疑惑

2022-03-14 09:13:21 字數 2893 閱讀 1161

1樓:匿名使用者

你這個問題非常有意義。

雖然我們都知道浮點數的格式定義在ieee 754,我們可以換算出你定義的值。但是你這裡列印的卻不是我們換算出來的值,說明這樣列印的方法有問題。

可以做以下試驗證明:比如你定義3個一樣的浮點數,float a, b ,c; a = b = c = 9.0;

理論上編碼方式一樣,列印出來就應該一樣(無論值是什麼)。可是用你的方法列印出來的結果是不一樣的!!!哈哈!

具體原因我也不清楚,一直想在記憶體裡面實際看看,最近工作忙,一直沒有對比過。我懷疑是地址選擇有些問題。也許用列印可以解決問題。

你可以試試看。或者用除錯工具吊起來實際看看。

2樓:貓校尉

你可以去找一下 計算機組成原理 看一下

裡面降到浮點數在計算機中的儲存形式,是由階符和階碼構成相如32位子長的計算機

第多少位到多少位是階符

第多少位到多少位是階碼

所以你那樣輸出不同的數,肯定覺得是沒有規律了。

找來看一下,一切都解決了。

3樓:疾似雲流

在計算機內部整數和浮點數的表示格式是不一樣的,整數的正負是用補碼機制來實現的,而浮點數是有一個特定的位來表示正負,另外8為或者11位(看是單精度還是雙精度)來表示指數,剩下的位才用來表示精度。

這個ieee標準上面有詳細的說明。

如果你沒看過計算機組成這本書的話,推薦清華出版社那本鄭緯民翻譯那本《計算機組成與設計——硬體/軟體介面》,本科生和研究生都是用的這本教材。

c語言實型(浮點型)資料在記憶體中的存放形式

4樓:gta小雞

實數分為float型和double型,它們分別對應ieee 754標準中的單精度浮點數和雙精度浮點數型別,在記憶體中的儲存形式遵守ieee 754浮點數標準。以float型別資料為例,3.14159表示成二進位制為11.

0010010000111111001111......,規格化後表示為1.10010010000111111001111×2^1(小數點後保留23位有效數字,因為ieee 754標準規定的尾數為23位);指數為1,故階碼為1+127=128=10000000;這是一個正數故符號位為0,因此它在記憶體中的表示形式是0 10000000 10010010000111111001111,寫成16進製為40490fcf。

關於浮點數在c語言中的儲存問題?

5樓:自我程式設計

寫c==2.468f就可以。

浮點數常量預設是double型。你直接寫2.468會強轉型。

c語言中浮點型資料的儲存方式

6樓:匿名使用者

所謂浮點數, 其實就是二進位制的科學計數法. 十進位制的科學計數法為 a.b * 10^n (這裡 "^" 表示冪).

其中a 大於或等於1而小於10. 只有0不能用這個形式表示.

二進位制的科學計數法為 1.x *10^n, 整數部分恆為1, 所以只要存貯x與n就可以.一般都是用一個位存貯符號, 再用幾個二進位制位存貯x, 另幾個二進位制位存貯n.

原則就是這樣了, 但具體的格式又有所區別. 比如按ieee來說, 有單精度, 雙精度等; 還有一些軟體自己定義的格式, 空間哪些位存貯x, 哪些位存貯n, 0怎麼辦, nan怎麼表示, 等等都要自己規定.

c語言浮點數儲存問題:c語言浮點數在記憶體中的儲存形態是什麼樣的?3個位元組儲存有效數字的範圍為什麼是6到7?

7樓:難得當歌對酒時

c語言的浮點數遵循 ieee 754 標準,請查閱相應資料即可。

浮點數的含義就是小數點不是固定的,其精度也不是固定的,舉例來說,c語言中的float型別佔用4個位元組長,這4個位元組分為如下3部分:

1位符號位 8位階碼 23位尾數部分這23位尾數才真正儲存了二進位制的有效位,將這23位二進位制轉換為十進位制也就6到7位有效數字。

c語言浮點數的儲存方式?為何浮點數儲存不準確?那個**是什麼意思?

8樓:匿名使用者

c語言中,無論是單精度還是雙精度在儲存中都分為三個部分:

1. 符號位(sign) : 0代表正,1代表為負2.

指數位(exponent)(注:也叫階碼):用於儲存科學計數法中的指數資料,並且採用移位儲存(注:

移碼編碼表示)

3. 尾數部分(mantissa):尾數部分關於不精確是由於十進位制小數部分化二進位制,常常化不盡。如同無限迴圈小數,最後有截斷誤差。

**中的是float型的變數的儲存上的格式。

9樓:匿名使用者

圖中已經說明了。

這是一個單精度浮點數。

每個單精度浮點數佔用四個位元組記憶體空間。這四個位元組在內部有不同的功能。

四個位元組一共由32位。

計算機中的浮點數就是指數學中的科學記數法。不過計算機中儲存二進位制,而科學記數法是10進位制的。

+1.34534534×10^3(用^後面的3表示10的冪)其中,第0位到22位,表示尾數,就是用於1.34534534的部分。

第23位到30位,表示指數,用於儲存3。

第31位,表示符號位,用於儲存符號。

浮點數儲存不精確,在於計算不結果不精確。

這種計算不精確,不在於計算本身,而在於浮點數表示範圍是有限的,當計算結果大於或小於浮點數表示範圍時,它實際儲存結果出現問題。

舉個例子,

讓你計算325+925。結果只能儲存三位數,最終應該是多少?肯定不是1250了,因為它是四位數。

C語言中浮點數變數範圍是怎麼計算出來的?還是官方定義的?為什

這個和儲存的格式有關係,先看看浮點數格式 一個浮點數總共有4個字專節,32位 第一個位元表符屬號 0正數 1負數 後八個位元表階碼,即為指數,這個數在實際的數上面加127最後23個位元表尾數 原碼錶示 實際上有8位是指數位 128到127 所以其範圍最大值是2 2 127 前面的2是因為最後23個位...

關於C語言中陣列的定義,C語言中如何定義陣列

一樣的,陣列在做函式引數時,傳遞給函式的都是陣列的首指標,哪怕你的函式這樣寫 void swp int p 在呼叫的時候swp array 也是可以的。只要傳遞給函式一個陣列的首指標就行了,而你的array正好是陣列的首指標。char s 10 123 是表示前三個元素分別是1,2,3但s 2 0 ...

關於C語言中的小問題,關於C語言中的一個小問題

其實我覺得你說得對,這個程式編的有些問題,你試著先輸出非空格的字元,程式會跳過 if c 這個判斷,然後lastc c後lastc中就存有你之前輸入的字元,你在輸入空格下次lastc c中就會存有空格。如果你先輸入空格,程式就會崩潰,應為lastc未定義,我用的vs2010已經試過了,你可以試試。望...