代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #include <stdio.h>
typedef unsigned char *byte_pointer;
void show_byte(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_byte((byte_pointer)&x,sizeof(int)); }
void show_float(float x){ show_byte((byte_pointer)&x,sizeof(float)); }
void show_pointer(void *x){ show_byte((byte_pointer)&x,sizeof(void *)); }
int main(){ /*show_type(byte_pointer start,int len);*/ short value = -0x12; short value2 = 0x12; byte_pointer valp = (byte_pointer)&value; byte_pointer valp2 = (byte_pointer)&value2; show_byte(valp,sizeof(short)); show_byte(valp2,sizeof(short)); /*show_int(value); show_float(value2);*/ return 0; }
|
结果与分析
0x12储存为1200,是因为Intel的机器大部分使用小端法储存数据(如果是大端法,该是0012)
-0x12储存为eeff,是因为负数在机器中以补码的形式储存,0x12取反再加一,再按照小端法,即为eeff。
如果将案例中的short改成int型,数据分别改为-12345和12345。如下代码所示:
1 2 3 4 5 6 7 8 9 10 11 12
| int main(){ /*show_type(byte_pointer start,int len);*/ int value = -12345; int value2 = 12345; byte_pointer valp = (byte_pointer)&value; byte_pointer valp2 = (byte_pointer)&value2; show_byte(valp,sizeof(int)); show_byte(valp2,sizeof(int)); /*show_int(value); show_float(value2);*/ return 0; }
|
输出结果为:
备注:12345的二进制表示为00000000000000000011000000111001,八进制为00003039。故按照小端法,储存为3930000