打印不同对象的字节表示--C

时间:2022-05-11 22:47:15

1. 首先,看看C中数字数据类型在32为机器和64为机器的字节数,针对大多数机器。

C声明 32位机器 64位机器
char 1 1
short int 2 2
int 4 4
long int 4 8
long long int 8 8
char * 4 8
float 4 4
double 8 8

对于虚拟地址空间,对于字长为w为的机器,程序最多访问2^w个字节。每一个地址(也可说是指针)的大小占用字长位。

2. 寻址和字节顺序

  不同机器中一个对象的字节顺序与地址顺序对应之间不同,两个通用规则是:

  大端模式:按照从最高有效字节到最低有效字节的顺序存储

  小端模式:按照从最低有效字节到最高有效字节的顺序存储

  例如 int x = 0X010203在Intel处理器的机器上有小端模式如下:

03 0x7ffc35e6c1ec
02 0x7ffc35e6c1ed
01 0x7ffc35e6c1ee
00 0x7ffc35e6c1ef

  可以看出有效字节从最低到最高存储。大端模式相反!

  下面进入c程序输出不同对象字节表示(参考书籍《深入理解计算机系统》):

/*定义函数处理不同类型以及字节输出函数*/

typedef unsigned char *  byte_pointer;

/*打印字节*/
void print_bytes(byte_pointer start, int len)
{
       int i;
       for(i = 0; i < len; i++)
       {
             printf("%.2x", start[i]);
             printf("  %p\n", &start[i]); //可以显示对应字节所在位置
       }            
}

/*int型*/
void print_int(int A)
{
       print_bytes((byte_pointer) &A, sizeof(int));
}

/*float型*/
void print_float(float A)
{
       print_bytes((byte_pointer) &A, sizeof(float));
}

/*指针类型*/
void print_pointer(void *A)
{
       print_bytes((byte_pointer) &A, sizeof(void *));
}

这段程序就对字节表示进行输出了,可以加深对指针内存的理解。