首页 > 代码库 > 《CSAPP》读书杂记 - Chapter 2. Representing and Manipulating Information
《CSAPP》读书杂记 - Chapter 2. Representing and Manipulating Information
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。