1. 程式人生 > >C語言之面試題(一)

C語言之面試題(一)

位擴充套件問題:

當不同的資料型別進行運算時,會發生強制或者隱式的型別轉換。通常時低精度的擴充套件到高精度。

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.