當前位置:首頁 » 服務存儲 » 未知變數的存儲格式
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

未知變數的存儲格式

發布時間: 2023-07-10 16:49:44

『壹』 c語言中變數的存儲類型有哪幾種,存儲方式哪幾種謝嘍

C語言中的變數有四種存儲類型,這四種存儲類型的關鍵字分別是auto(自動),extern(外部),static(靜態)和register(寄存器)。

『貳』 C語言中如何將未知個數的數存放在一個數組中

在C語言中數組的定義必須指明維數,即使沒有指明維數,也必須進行初始化,編譯器通過初始化列表中的元素個數來確定數組的維數,比如下面的代碼:

int a[] = {1,2,3};

雖然沒有指明數組的維數,但是編譯知道數組a的維數是3(只有三個元素)。


要實現未知個數的元素存儲於數組中,可以使用malloc()和free()來進行動態內存分配 。下面是一個使用動態內存的示例:


#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>

intmain()
{
intsize;
printf("輸入建立元素的個數:");
scanf("%d",&size);
int*p=(int*)malloc(sizeof(int)*size);
if(p==0){
printf("不能分配內存 ");
return0;
}

//初始化內存
memset(p,0x00,sizeof(int)*size);
//釋放內存
free(p);
return0;
}

『叄』 請教變數數據在內存中的存儲方式,比如int a=2,那麼在內存中是怎麼存儲的呢

額 你理解錯了 。 跟本就不存在a的ASCII碼值。
這樣看:定義了一個變數,給它取個名字叫a,這個名字是給你程序員看的,計算機跟本不看這個a,a對計算機來說只是一個標識,它標識著在內存中所佔用的一個大小為4B的內存空間,並且!這4B的空間存放一個整數,其值為2. 而在存儲的時候是這樣存的
由於內存的最小單位是位元組,也就是1B是最小的單位,而一個int類型的數據在32的系統中要佔用32位大小, 換算一個 8位=1位元組 即8bit=1B 那麼32位=4位元組。 這個2轉換成二進制數是10 ,但計算機要求用32位的數來存放這個2 ,咋辦? 補0唄。在哪補? 肯定不能在後邊補啊,那就變成別的數了—— 那,那就在前補。
所以是00000000 00000000 00000000 00000010
以上便是2這個數在計算機內存中的形式, 每8位一組分成4組剛好是4B大小,所以內存中就有連著的4個內存單元 來存放這個數值2. 而這一內存單元我們把它叫做a, 計算機也正是通過這個名字來標識這個數。
綜上,總結一下,a這個字母是給程序員看的, 計算機不認識a這字母,a在計算機中僅僅是轉換為一個計算機用於標識這個數值2的其它的什麼東西。 具體是什麼東西你不必要了解,其實我也不知道。而這個2在內存中存放的形式是佔用4個內存單元的空間。
樓主想更深入了解這方面,建議把C語言學一遍後學學匯編語言就很清楚了

『肆』 【求助c語言】,凡是函數中未指定存儲類別的全局變數,其隱含的存儲類別為

全局變數其默認儲存類型都是extern

而局部變數的默認儲存類型是
auto,
函數中聲明的變數是局部變數,所以原題中說
「函數中未指定存儲類別的全局變數」
這句本身就有問題。
記著:
全局變數
extern
局部變數
auto

『伍』 變數的存儲類型是什麼

量有4種存儲類型,分別是auto(自動型)、static(靜態型)、register(寄存器型)和extern(外部型)。在定義或說明一個變數時可以加上存儲類型關鍵字,以限定其存儲類別。
存儲類型決定了系統將在哪一個數據存儲區為變數分配存儲空間。

『陸』 float變數在內存當中是怎樣存儲的或是怎樣的一種存儲格式

浮點型變數在計算機內存中佔用4位元組(Byte),即32-bit。遵循IEEE-754格式標准。
一個浮點數由2部分組成:底數m 和 指數e。
±mantissa × 2exponent
(注意,公式中的mantissa 和 exponent使用二進製表示)
底數部分使用2進制數來表示此浮點數的實際值。
指數部分佔用8-bit的二進制數,可表示數值范圍為0-255。但是指數應可正可負,所以IEEE規定,此處算出的次方須減去127才是真正的指數。所以float的指數可從 -126到128.
底數部分實際是佔用24-bit的一個值,由於其最高位始終為 1 ,所以最高位省去不存儲,在存儲中只有23-bit。
到目前為止, 底數部分 23位 加上指數部分 8位 使用了31位。那麼前面說過,float是佔用4個位元組即32-bit,那麼還有一位是幹嘛用的呢? 還有一位,其實就是4位元組中的最高位,用來指示浮點數的正負,當最高位是1時,為負數,最高位是0時,為正數。
浮點數據就是按下表的格式存儲在4個位元組中:
Address+0 Address+1 Address+2 Address+3
Contents SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM S: 表示浮點數正負,1為負數,0為正數
E: 指數加上127後的值的二進制數
M: 24-bit的底數(只存儲23-bit)
主意:這里有個特例,浮點數 為0時,指數和底數都為0,但此前的公式不成立。因為2的0次方為1,所以,0是個特例。當然,這個特例也不用認為去干擾,編譯器會自動去識別。

通過上面的格式,我們下面舉例看下-12.5在計算機中存儲的具體數據:
Address+0 Address+1 Address+2 Address+3
Contents 0xC1 0x48 0x00 0x00 接下來我們驗證下上面的數據表示的到底是不是-12.5,從而也看下它的轉換過程。
由於浮點數不是以直接格式存儲,他有幾部分組成,所以要轉換浮點數,首先要把各部分的值分離出來。
Address+0 Address+1 Address+2 Address+3
格式 SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
二進制 11000001 01001000 00000000 00000000
16進制 C1 48 00 00
可見:
S: 為1,是個負數。
E:為 10000010 轉為10進制為130,130-127=3,即實際指數部分為3.
M:為 10010000000000000000000。 這里,在底數左邊省略存儲了一個1,使用 實際底數表示為 1.10010000000000000000000
到此,我們吧三個部分的值都拎出來了,現在,我們通過指數部分E的值來調整底數部分M的值。調整方法為:如果指數E為負數,底數的小數點向左移,如果指數E為正數,底數的小數點向右移。小數點移動的位數由指數E的絕對值決定。
這里,E為正3,使用向右移3為即得:
1100.10000000000000000000
至次,這個結果就是12.5的二進制浮點數,將他換算成10進制數就看到12.5了,如何轉換,看下面:
小數點左邊的1100 表示為 (1 × 23) + (1 × 22) + (0 × 21) + (0 × 20), 其結果為 12 。
小數點右邊的 .100… 表示為 (1 × 2-1) + (0 × 2-2) + (0 × 2-3) + ... ,其結果為.5 。
以上二值的和為12.5, 由於S 為1,使用為負數,即-12.5 。
所以,16進制 0XC1480000 是浮點數 -12.5 。

上面是如何將計算機存儲中的二進制數如何轉換成實際浮點數,下面看下如何將一浮點數裝換成計算機存儲格式中的二進制數。
舉例將17.625換算成 float型。
首先,將17.625換算成二進制位:10001.101 ( 0.625 = 0.5+0.125, 0.5即 1/2, 0.125即 1/8 如果不會將小數部分轉換成二進制,請參考其他書籍。) 再將 10001.101 向右移,直到小數點前只剩一位 成了 1.0001101 x 2的4次方(因為右移了4位)。此時 我們的底數M和指數E就出來了:
底數部分M,因為小數點前必為1,所以IEEE規定只記錄小數點後的就好,所以此處底數為 0001101 。
指數部分E,實際為4,但須加上127,固為131,即二進制數 10000011
符號部分S,由於是正數,所以S為0.
綜上所述,17.625的 float 存儲格式就是:
0 10000011 00011010000000000000000
轉換成16進制:0x41 8D 00 00
所以,一看,還是佔用了4個位元組。

下面,我做了個有趣的實驗,就是由用戶輸入一個浮點數,程序將這個浮點數在計算機中存儲的二進制直接輸出,來看看我們上面所將的那些是否正確。
有興趣同學可以到VC6.0中去試試~!

#include<iostream.h>
#define uchar unsigned char
void binary_print(uchar c)
{
for(int i = 0; i < 8; ++i)
{
if((c << i) & 0x80)
cout << '1';
else
cout << '0';
}
cout << ' ';
}

void main()
{
float a;
uchar c_save[4];
uchar i;
void *f;
f = &a;
cout<<"請輸入一個浮點數:";
cin>>a;
cout<<endl;
for(i=0;i<4;i++)
{
c_save[i] = *((uchar*)f+i);
}
cout<<"此浮點數在計算機內存中儲存格式如下:"<<endl;
for(i=4;i!=0;i--)
binary_print(c_save[i-1]);
cout<<endl;
}

好了,我想如果你仔細看完了以上內容,你現在對浮點數算是能比較深入的了解了。

『柒』 函數中未指定存儲類別的局部變數,其隱含的存儲類別為()

函數中未指定存儲類別的局部陪襪變數,其隱含的存儲類別為自動存儲類別。

函數中的局部變數,如果不專門聲明為static存儲類別,都是動態的分配存儲空間的,數租唯據存儲在動態存儲區中。

這類變數叫做自動變數,自動變數可以用關鍵字auto作為存儲類別的聲明,實際上關鍵字auto是可以省略的(一般都是不寫的),不寫則自動隱含為「自動存儲類別「。

(7)未知變數的存儲格式擴展閱讀:

默認情況下,在代碼塊內聲明的變數都是自動變數,但蘆型激亦可用自動變數的關鍵字auto明確標識存儲類;而如若使用register(而非auto)存儲類標識代碼塊內的變數,編譯器就會將變數緩存於處理器內的寄存器中,此種情況下不能對該變數或其成員變數使用引用操作符&以獲取其地址,因為&只能獲取內存空間中的地址。

除此以外,由於寄存器的數量及其所能存儲的數據類型受硬體限制而可能無法存儲指定變數,編譯器可以忽略聲明內的register關鍵字。對於一個未初始化的自動變數來說,在為其賦值之前其值都為undefined(未定義)。

在C++中,如諺語「資源獲取即初始化」(Resource Acquisition Is Initialization,常縮寫為RAII)所述,自動變數的構造函數在程序運行至聲明部分的時候才會被調用,而當程序運行至所給的程序塊末端的時候則調用析構函數,這一特性常應用於資源的分配與釋放管理,如自動關閉已開啟的文件或自動釋放空閑內存。

『捌』 C語言中變數的存儲類型有哪幾種,存儲方式哪幾種謝嘍

在C語言中,對變數的存儲類型說明有以下四種:

1、auto 自動變數

2、register 寄存器變數

3、extern 外部變數

4、static 靜態變數

所謂存儲類型是指變數佔用內存空間的方式,也稱為存儲方式。

變數的存儲方式可分為「靜態存儲」和「動態存儲」兩種。

1、靜態存儲變數通常是在變數定義時就在存儲單元並一直保持不變,直至整個程序結束。

2、動態存儲變數是在程序執行過程中,使用它時才分配存儲單元,使用完畢立即釋放。典型的例子是函數的形式參數,在函數定義時並不給形參分配存儲單元,只是在函數被調用時,才予以分配,調用函數完畢立即釋放。

如果一個函數被多次調用,則反復地分配、釋放形參變數的存儲單元。從以上分析可知,靜態存儲變數是一直存在的,而動態存儲變數則時而存在時而消失。

(8)未知變數的存儲格式擴展閱讀:

變數根據定義的位置的不同的生命周期,具有不同的作用域,作用域可分為6種:全局作用域,局部作用域,語句作用域,類作用域,命名空間作用域和文件作用域。

一、從作用域看:

1、全局變數具有全局作用域。全局變數只需在一個源文件中定義,就可以作用於所有的源文件。當然,其他不包含全局變數的定義的源文件需要用extern關鍵字再次聲明這個全局變數。

2、靜態局部變數具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束一直存在,它和全局變數的區別在於全局變數對所有函數都是可見的,而靜態局部變數只對定義自己的函數體始終可見。

3、局部變數也只有局部作用域,它是自動對象(auto),它在程序運行期間不是一直存在,而是只在函數執行期間存在,函數的一次調用執行結束後,變數被撤銷,其所佔用的內存也被收回。

4、靜態全局變數也具有全局作用域,它與全局變數的區別在於如果程序包含多個文件的話,它作用於定義它文件里,不能作用到其他文件里,即被static關鍵字修飾過的變數具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態全局變數,它們也是不同的變數。

二、從分配空間看:

全局變數,靜態局部變數,靜態全局變數都在靜態存儲區分配空間,而局部變數在棧里分配空間。

全局變數本身就是靜態存儲方式,靜態全局變數當然也是靜態存儲方式。這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變數的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變數在各個源文件中都是有效的。

而靜態全局變數則限制了其作用域,即只在定義該變數的源文件內有效,在同一個源程序的其他源文件中不能使用它。由於靜態全局變數的作用域局限於一個源文件內,只能為該源文件內的函數公用,因此可以避免在其他源文件中引起錯誤。

1、靜態變數會放在程序的靜態數據存儲區(全局可見)中,這樣可以在下一次調用的時候還可以保持原來的賦值。這一點是它與堆棧變數和堆變數的區別。

2、變數用static告知編譯器,自己僅僅在變數的作用范圍內可見。這一點是它與全局變數的區別。

參考資料來源:網路-變數-存儲類型