c語言數據如何存儲
1、float類型數字在計算機中用4個位元組(32位)存儲。
遵循IEEE-754格式標准:
一個浮點數由3部分組成:符號位s(1位)和、指數e(8位)、底數m(23位)
2、格式
SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
S:符號位
E:指數,十進制指數加上127後的值得二進制數據
M:底數
3、符號位
指底數的符號,可正可負。
4、指數
佔用8bit的二進制數,可表示數值范圍為0-255。
但是指數可正可負,所以,IEEE規定,此處算出的次方必須減去127才是真正的指數。
所以,float類型的指數可從-126到128
5、底數
實際是佔用24bit的一個值,但是最高位始終為1,所以,最高位省去不存儲,在存儲中佔23bit
科學計數法。
再舉一例:
17.625在內存中的存儲
首先要把17.625換算成二進制:10001.101
在將10001.101右移,直到小數點前只剩1位:
1.0001101 * 2^4 因為右移動了四位
底數:因為小數點前必為1,所以IEEE規定只記錄小數點後的就好。所以,此處的底數為:0001101
指數:實際為4,必須加上127(轉出的時候,減去127),所以為131。也就是10000011
符號:整數,所以是0
綜上所述,17.625在內存中的存儲格式是:
01000001 10001101 00000000 00000000
2. C語言的基本類型在內存中怎麼儲存的
1、整型數據:所有整數(正負零)在內存中都是以補碼的形式存在。對於一個正整數來說,它的補碼就是它的原碼本身。對於一個負整數來說,它的補碼為原碼取反再加1。
2、字元型數據:把字元的相對應的ASCII碼(整數,映射關系見ASCII碼表)放到存儲碼單元中,而這些ASCII代碼值在計算機中同樣以二進制補碼的形式存放的。
3、實型數據:也叫浮點數,在計算機中也是以二進制的方式存儲,關鍵在於如何將十進制的小數轉化為二進制來表示。
(2)c語言數據如何存儲擴展閱讀
C語言存儲數據使用注意事項
C語言中(包括C++/Java)實際存儲浮點數都不是這樣直接存儲「整數二進制+小數二進制」就完事的,這只是第一步。轉化二進制以後還要進行處理,實際的存儲標準是IEEE754
遇見一直「乘不凈」的浮點數,最終能取多少位取決於編譯器對應的浮點類型數據的分配位元組,位元組數越多越精確。故double要比float精確不僅僅是整數部分上限更高,小數部分也能取到更低的位數,故而更精確。
盡量避免大的浮點數和小浮點數運算,由於浮點數存儲的特點,常常會使小的浮點數丟失且判斷兩個浮點數或一個浮點數和整數,常量是否相等,使用abs(x-y)<0.000001這種形式。
3. C語言編程常見問題解答之變數和數據存儲
第2章 變數和數據存儲
C語言的強大功能之一是可以靈活地定義數據的存儲方式。C語言從兩個方面控制變數的性質:作用域(scope)和生存期(lifetime)。作用域是指可以存取變數的代碼范圍,生存期是指可以存取變數的時間范圍。
作明告用域有三種:
1. extern(外部的) 這是在函數外部定義的變數的預設存儲方式。extern變數的作用域是整個程序。
2.static(靜態的) 在函數外部說明為static的變數的作用域為從檔畢定義點到該文件尾部;在函數內部說明為static的變數的作用域為從定義點到該局部程序塊尾部。
3.auto(自動的) 這是在函數內部說明的變數的預設存儲方式。auto變數的作用域為從定義點到該局部程序塊尾部。
變數的生存期也有三種,但它們不象作用域那樣有預定義的關鍵字名稱。第一種是extern和static變數的生存期,它從main()函數被調用之前開始,到程序退出時為止。第二種是函數參數和auto變數的生存期,它從函數調用時開始,到函數返回時為止。第三種是動態分配的數據的生存期,它從程序調用malloc()或calloc()為數據分配存儲空間時開始,到程序調用free()或程序退出時為止。
2.1 變數存儲在內存(memory)中的什麼地方?
變數可以存儲在內存中的不同地方,這依賴於它們的生存期。在函數外部定義的變數(全局變數或靜態外部變數)和在函數內部定義的static變數,其生存期就是程序運行的全過程,這些變數被存儲在數據段(datasegment)中。數據段是在內存中為這些變數留出的一段大小固定的空間,它分為兩部分,一部分用來存放初始化變數,另一部分用來存放未初始化變數。
在函數內部定義的auto變數(沒有用關鍵字static定義的變數)的生存期從程序開始執行其所在的程序塊代碼時開始,到程序離開該程序塊時為止。作為函數參數的變數只在調用該函數期間存在。這些變數被存儲在棧(stack)中。棧是內存中的一段空間,開始很小,以後逐漸自動增大,直到達到某個預定義的界限。在象DOS這樣的沒有虛擬內存(virtual memory)的系統中,這個界限由系統決定,並且通常非常大,因此程序員不必擔心用盡棧空間。關於虛擬內存 的討論,請參見2.3。
第三種(也是最後一種)內存空間實際上並不存儲變數,但是可以用來存儲變數所指向的數據。如果把調用malloc()函數的結果賦行槐芹給一個指針變數,那麼這個指針變數將包含一塊動態分配的內存的地址,這塊內存位於一段名為「堆(heap)」的內存空間中。堆開始時也很小,但當程序員調用malloc()或calloc()等內存分配函數時它就會增大。堆可以和數據段或棧共用一個內存段(memorysegment),也可以有它自己的內存段,這完全取決於編譯選項和操作系統。
與棧相似,堆也有一個增長界限,並且決定這個界限的規則與棧相同。
請參見:
1.1 什麼是局部程序塊(10calblock)?
2.2 變數必須初始化嗎?
2.3 什麼是頁抖動(pagethrashing)?
7.20 什麼是棧(stack)?
7.21 什麼是堆(heap)7 .
2.2 變數必須初始化嗎?
不。使用變數之前應該給變數一個值,一個好的編譯程序將幫助你發現那些還沒有被給定一個值就被使用的變數。不過,變數不一定需要初始化。在函數外部定義的變數或者在函數內部用static關鍵字定義的變數(被定義在數據段中的那些變數,見2.1)在沒有明確地被程序初始化之前都已被系統初始化為0了。在函數內部或程序塊內部定義的不帶static關鍵字的變數都是自動變數,如果你沒有明確地初始化這些變數,它們就會具有未定義值。如果你沒有初始化一個自動變數,在使用它之前你就必須保證先給它賦值。
調用malloc()函數從堆中分配到的空間也包含未定義的數據,因此在使用它之前必須先進行初始化,但調用calloc()函數分配到的空間在分配時就已經被初始化為0了。
請參見:
1.1 什麼是局部程序塊(10calblock)?
7.20 什麼是棧(stack)?
7.21 什麼是堆(heap)?
2.3 什麼是頁抖動(pagethrashing)?
有些操作系統(如UNIX和增強模式下的Windows)使用虛擬內存,這是一種使機器的作業地址空間大於實際內存的技術,它是通過用磁碟空間模擬RAM(random—access memory)來實現的。
4. c語言中怎麼存儲一個很大很大的數
C語言的系統類型,均有大小的限制。超出這個存儲范圍,就無法用該類型進行存儲。所以需要根據數據規模,來選擇存儲類型。
當需要存儲的數很大很大,超出所有可以類型可以表示的范圍時,比如一個100位的10進制數,就需要用字元串的方式進行存儲。這種存儲方式,在演算法中稱為大數存儲,對這種大數的計算,稱為大數計算。
(4)c語言數據如何存儲擴展閱讀:
順序結構:
順序結構的程序設計是最簡單的,只要按照解決問題的順序寫出相應的語句就行,它的執行順序是自上而下,依次執行。
例如:a = 3,b = 5,現交換a,b的值,這個問題就好像交換兩個杯子裡面的水,這當然要用到第三個杯子,假如第三個杯子是c,那麼正確的程序為:c = a; a = b; b = c;執行結果是a = 5,b = c = 3如果改變其順序。
寫成:a = b; c = a; b =c;則執行結果就變成a = b = c = 5,不能達到預期的目的,初學者最容易犯這種錯誤。順序結構可以獨立使用構成一個簡單的完整程序,常見的輸入、計算、輸出三步曲的程序就是順序結構。
例如計算圓的面積,其程序的語句順序就是輸入圓的半徑r,計算s = 3.14159*r*r,輸出圓的面積s。不過大多數情況下順序結構都是作為程序的一部分,與其它結構一起構成一個復雜的程序,例如分支結構中的復合語句、循環結構中的循環體等。
5. c語言編程中怎麼用文件存儲數據具體一點,謝謝
主要用C語言的庫函數,有open write read 或者是fopen fwrite fread這幾個函數,迅速就是先open 然後write,具體函數的用法可自行網路,如果你是問存儲數據的格式的話,自己定義結構體存儲的方式是最方便直接的
6. 編寫好一個C語言程序,如何把數據一直保存下來
用數組保存。定義一個數組。
如:int a[6]={1,2,3,4,5,6};
然後輸出
for(i=0;i<6;i++){
printf("%d",a[i]);}
代碼如下:
#include<stdio.h>
int main(){
int a[6]={1,2,3,4,5,6};
int i;
for(i=0;i<=5;i++)
printf("%d ",a[i]);
}
(6)c語言數據如何存儲擴展閱讀
保存方法二如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
FILE *fp;
char in;
fp = fopen("test.txt","w");
printf("請輸入一個字元串(以!結束): ");
while((in=getchar()) != '!')
{
if(in <='z' && in >= 'a')
{
in -= 32;
}
fputc(in,fp);
}
fclose(fp);
return 0;
}