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