天天看點

《C語言深度剖析》學習筆記

int main()

{

int i;

char a[100];

for(i=0; i<100; i++)

     a[i] = -1 - i;

printf(“%d\n”, strlen(a));

}

在計算機系統中, 數值采用補碼來表示(存儲),正數的補碼和原碼一緻,負數的補碼:符号位為1,其餘位為該數的絕對值的原碼按位取反,然後整個數加1.

-1的補碼是0xff,-2的補碼是0xfe,當i的值為127時,a[127]=-128,char最小能表示-128,當i增加時,會發生溢出。char類型資料隻有8位, -129需要9位才能存儲,是以最高位被丢棄剩下的8位是原來補碼的低8位,即0x7f。當i繼續增加到255時,-256的補碼的低8位是0。然後當i增加到256時,-257的補碼的低8位為0xff,此時能重新存儲。

是以結果為255。

編譯器通常不為普通const變量配置設定存儲空間,而是将他們儲存在符号表中, 這使得它成為一個編譯期間的值,沒有了存儲于度記憶體的操作,使得它的效率也很高。

eg:

                #define m 3       //宏常量

                const int n 5     //此時并未将n放入記憶體中

                ……

                int i = n;               // 此時為n配置設定記憶體,以後不再配置設定

                int i = m;              // 預編譯期間進行宏替換,配置設定記憶體

                int j = n;              //沒有記憶體配置設定

                int j = m;             // 再進行宏替換,再次配置設定記憶體

                const定義的隻讀變量從彙編 的角度來看,隻是給出了對應的記憶體位址,而不是像#define一樣給出的是立即數,是以,const定義的隻讀變量在程式運作過程中隻有一份拷貝(因為此處是全局的隻讀變量,存放在靜态區),而#define定義的宏替換在記憶體中有若幹拷貝。#define宏是在預編譯階段進行替換,而const修飾的隻讀變量時在編譯的時候确定其值。#define宏沒有類型,而const修飾的隻讀變量具有特定的類型。

const的修飾對象:

近水樓台先得月:離誰近就修飾誰

判斷的時候先忽略類型名:

const (int) *p     //修飾*p,指針可變,指向的對象不可變

(int) const *p   //同上

(int)*const p    // 修飾p,指針不可變,指向的對象可變

空結構的大小為1

union:一個union隻配置一個足夠大的空間以容納最大長度的資料成員,也就是說union裡的成員同一時間不可能同時存在

大端模式:字資料的高位元組存儲在低位址中,而字資料的低位元組存儲在高位址中;

小端模式:字資料的高位元組存儲在高位址中,而字資料的低位元組存儲在低位址中;

使用函數确定系統的存儲位元組序

int i = 1;

小端模式:

0x0

0x1

                                高位址                                                                                                                 低位址

大端模式:

                                低位址                                                                                                                 高位址

                                資料讀取從高位址開始讀取;

code:

                int checksysytem()

                                union check{

                                int i;

                                char ch;

                                }c;

                                c.i = 1;

                                return (1 == c.ch);

如果系統是大端存儲,則函數中c.ch=0, 如果系統是小端存儲,則函數中c.ch=1;

enum 枚舉

常量的集合  未指派則自動指派為上一個常量+1

繼續閱讀