剛纔看到本身曾經寫的一段代碼,名爲「print_bit.c」的c文件。雖然已經想不起來是爲什麼寫它,但經分析可知源目的多是想將一個int型的數按字節打印,順即可以分析出系統是大端仍是小端。測試
代碼以下:spa
main() { int p = 3; printf("*(&p):%x\t%x\n",*(char *)(&p),(char *)((&p)+0)); printf("*(&p+1):%x\t%x\n",*(char *)((&p)+1),(char *)((&p)+1)); printf("*(&p+2):%x\t%x\n",*(char *)((&p)+2),(char *)((&p)+2)); printf("*(&p+3):%x\t%x\n",*(char *)((&p)+3),(char *)((&p)+3)); }
運行結果以下:code
由上述結果可知,這段代碼有誤!對象
首先,程序沒有依照預想的輸出 int p 的四個字節的值;其次,由第二列的數據可知,地址長度爲4個字節。也就是說,(&p+1)指向了p的下4個字節的首地址(此處越界訪問了),以此類推。blog
因此說,&p+1中的1表明多少,與定義p時的類型有關。當我將p定義爲char型時,第二列的值是依次增長1的。it
那麼如何將一個數據以字節形式打印出來呢?首先須要將p的地址強制轉換並賦值給unsigned char *型的變量,而後再依次打印,代碼以下:io
main() { int p1 = 3; unsigned char *byt = (unsigned char *)&p1; printf("*(&p+0):%x\t%x\n",*(byt),(unsigned int)byt); printf("*(&p+1):%x\t%x\n",*(byt+1),(unsigned int)(byt+1)); printf("*(&p+2):%x\t%x\n",*(byt+2),(unsigned int)(byt+2)); printf("*(&p+3):%x\t%x\n",*(byt+3),(unsigned int)(byt+3)); }
下面就是咱們想要的結果了:class
由此咱們還能夠知道本系統是小端系統。dva
下面附上不一樣類型對象的字節表示:(摘自《深刻理解計算機系統》第二章)變量
#include <stdio.h> typedef unsigned char *byte_pointer; void show_bytes(byte_pointer start, int len) { int i; for(i = 0; i < len; i++) printf(" %.2x",start[i]); printf("\n"); } void show_int(int x) { show_bytes((byte_pointer) &x,sizeof(int)); } void show_float(float x) { show_bytes((byte_pointer) &x,sizeof(float)); } void show_pointer(void *x) { show_bytes((byte_pointer) &x,sizeof(void *)); } void show_double(double x) { show_bytes((byte_pointer) &x,sizeof(double)); } //測試
main() { int ival = 3; float fval = 0.0; double dval = 0.0; int *pi = &ival; float *pf = &fval; show_int(ival); show_float(fval); show_double(dval); show_pointer(pi); show_pointer(pf); }
個人測試結果以下: