C語言之面試題(一)
阿新 • • 發佈:2019-01-10
位擴充套件問題:
當不同的資料型別進行運算時,會發生強制或者隱式的型別轉換。通常時低精度的擴充套件到高精度。
char a,b,c;
a=1;
b=127;
c=a+b
print("%d",strlen(a+b));//打印出來為4
print("%d",strlen(c)); //打印出來為1
雖然a和b都是一位元組,但是為了進行運算,先統一轉換為int位元組,生成c後再轉換char。所以strlen(a+b)為4個位元組。
typedef struct { int a:2; int b:2; int c:1; }test; /* 資訊儲存時,並不需要佔用一個完整的位元組,有時只需幾個或一個二進位制位。為了節省儲存空間,C語言提供 了一種資料結構,稱為"位域"或"位段"。因為a佔兩個位,b佔兩個位,c佔一個位。int是有符號整型,它是有符號位的,也就是a和b,實際上只能存一個二進位制位,另外一個是它的符號位。所以 a:01 表示為1 b:11 表示-1. c只有一位,具體值是什麼,取決於編譯器。1,如果看作符號位,就是-1;沒有符號位就是1. */ int main() { test test1; test1.a=1 test1.b=3; test1.c=1; cout <<test1.a <<endl; //print 1 cout <<test1.b <<endl; // -1 cout <<test1.c <<endl; // 1 return 0; }
對絕對地址0x100000賦值,並且程式跳到0x100000執行。
/*對絕對地址0x100000賦值*/
*(unsigned int*)0x100000=1234;
/*程式跳到0x100000執行*/
/*函式指標*/
typedef void Voditest();
(*(Voidtest*)0x100000)();
//*((void(*)())0x100000)()
//void(*)()==>函式指標 *((函式指標)地址)()
char c=128;
printf("c=%u\n",c);
//c=-128; 輸出的是int,最高位是1,是負數。取反加一,輸出是-128.