常量與變數以及在記憶體中儲存形式

2021-07-15 01:22:01 字數 1744 閱讀 8685

變數:其值在其作用域內可以改變的量叫做變數。變數在其使用前必須定義,每乙個變數都有自己的位址。

變數可以分為整型、浮點型(實數)、字元型、指標型。

每乙個變數被定義好了,系統就會分配位元組給其來存放值。

整型變數:4個位元組(長整型4、短整型2,(無符號型與有符號的位元組數一樣,只是有符號的最高位為符號位))。

浮點型變數:float4個位元組,double8個位元組。

字元型變數:1個位元組。

整型變數在記憶體裡是以二進位制補碼的形式存放的。例如:-18 二進位制是 1000 0000 0000 0000 0000 0000 0001 0010(原碼)1111 1111 1111 1111 1111 1111 1110 1101(反碼)1111 1111 1111 1111 1111 1111 1110 1110(反碼)(負數的補碼為原碼去反加一,最高位保持不變為符號位,正數的原、反、補一樣。符號位0為正,1為負)。

字元型變數在記憶體裡也是以補碼形式存放的,是以ascll碼的補碼形式存放的。例如:char t;t = 98;printf("%c",t);輸出為小寫的b。在計算機中是以98的補碼存放的的。

c語言允許對整形變數賦以字元值,也允許對字元變數賦以整形值。在輸出時,允許把字元變數按整形輸出,也允許把整形量按字元量輸出。

浮點型變數的儲存:浮點表示法類似於科學計數法,任一數均可通過改變指數部分,使小數點位置發生移動,如23.45可以寫成:2.345*10^1

浮點表示的一般形式為:r=m*2^e (r:real m:mantissa尾數 e:exponent階碼)

把上面float的二進位制可分成三部分:

x        ******xx        *********************xx

數符(1b)   階碼(8b)      尾數(23b)

double型的浮點數分別是:數符(1b)、階碼(8b)、尾數(52b)

數符sign:real的正負號 "+":0 "-":1。階碼e:這裡二進位制其實是移碼e(0~255)的表示,e=e-127(double型中e=e-1023) e為正值說明這個浮點數向左移動了e位,e為負值說明這個浮點數向右移動了e位。127=2^7-1 1023=2^10-1

尾數m:有效數字位,這裡是有效數字位的部分二進位製碼.

正因為整型與浮點型儲存方法不同,所以轉換不能隨意。

例如:

上面這個程式輸出為:-1610612736。

要想正確輸出加上: int b;b=(int) a;printf("%d",b);輸出為34.

所以要想型別變換輸出要加強制轉換:(型別名) 變數。

float與double轉換也要注意,乙個是4個位元組,乙個是8個位元組,printf從高子節輸出,而scanf從低位元組輸入。

例如:

若給a賦值12.54,輸出確實0.000000.

double裡8個位元組,scanf(%f),%f為float型4個位元組,從低位輸入,高四位沒有值為0,所以printf為0.000000

所以程式中變數應該與格式符對應。

注意:float a;

a = 3;和

scanf("%d",&a);然後把3給a是不一樣的。a=3中3是浮點型只是形式是3而scanf中輸入3就是整型,而整型與浮點型儲存格式不同。

常量:值不會發生改變。

float在記憶體中儲存

浮點型變數在計算機記憶體中占用4位元組 byte 即32 bit。遵循ieee 754格式標準。乙個浮點數由2部分組成 底數m 和 指數e。mantissa 2exponent 注意,公式中的mantissa 和 exponent使用二進位制表示 底數部分 使用 進製數來表示此浮點數的實際值。指數部...

float在記憶體中儲存方式

依據ieee規定 float在儲存中都分為三個部分 符號位 sign 0代表正,1代表為負 指數字 exponent 用於儲存科學計數法中的指數資料,並且採用移位儲存 尾數部分 mantissa 尾數部分 其中floa和doublet的儲存方式如下圖所示 8.25用十進位制的科學計數法表示就為 8....

有關字元常量儲存引起的資料在記憶體中儲存的若干問題

字串常量,放在哪個儲存區呢?是 自動儲存區 還是 靜態儲存區 中?比如 char pstr hello world 這裡,hello world 是乙個字串常量,pstr是在棧中的變數。我想問,字串常量,在哪個記憶體區域分配空間呢?好像應該不是在 棧區 分配空間吧!一 預備知識 程式的記憶體分配 乙...