码迷,mamicode.com
首页 > 移动开发 > 详细

《CSAPP》读书杂记 - Chapter 2. Representing and Manipulating Information

时间:2014-10-25 21:25:50      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   ar   for   sp   数据   div   

1.

代码:

#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 test_show_bytes(int val)
{
  int ival = val;
  float fval = (float)ival;
  int *pval = &ival;
  printf(" %x\n", pval);
  show_int(ival);
  show_float(fval);
  show_pointer(pval);
}

int main()
{
  test_show_bytes(12345);
}

运行结果:

 56683c18
 39 30 00 00
 00 e4 40 46
 18 3c 68 56 ff 7f 00 00

其中函数show_int()、show_float()的调用比较好理解。

show_int()中&x取到实际地址。为使获取地址指向数据中每个字节的内容,需要进行类型转换,即把int *转换成unsigned char *,但是类型转换后已经不知道数据的长度,所以需要人工传入数据长度的参数,即 sizeof(int)。此后,把每次指针指向的内容(unsigned char形式)以十六进制形式输出。show_float()类似。

int *pval = &val 运行后,pval为指针,64位,其内容指向val的地址。printf(" %x\n", pval)是以十六进制形式输出地址,但是由于 %x只能表示32位,所以去掉高32位,变成 56 68 3c 18,小端模式输出后即为 18 3C 68 56

《CSAPP》读书杂记 - Chapter 2. Representing and Manipulating Information

标签:style   blog   color   io   ar   for   sp   数据   div   

原文地址:http://www.cnblogs.com/Azurewing/p/4050857.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!