代码功能
展示了数据在内存中的形式及其所在地址,可以看出大小端模式,强制类型转换发生的溢出。
代码分析
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, size_t len)
{
size_t i;
for (i = 0; i < len; i++)
printf("%p\t0x%.2x\n", &start[i], start[i]);
printf("\n");
}
- size-t全称为size type,可以计算数据的大小,通常使用的sizeof()的结果就可以被定义为size-t。
- %p输出start[i]所在地址,0x%.2x输出start[i]的值,都是以十六进制输出。
- show_bytes函数输出数据的值和其所在地址,本篇代码中的其他函数都在调用show_bytes函数。
例如
void show_int(int x) {
show_bytes((byte_pointer) &x, sizeof(int));
}
//输出int型数据
void show_float(float x) {
show_bytes((byte_pointer) &x, sizeof(float));
}//输出float型数据
void test_show_bytes(int val) {
int ival = val;
//float fval = (float) ival;
double fval = (double) ival;
int *pval = &ival;
printf("Stack variable ival = %d\n", ival);
printf("(int)ival:\n");
show_int(ival);
printf("(float)ival:\n");
show_float(fval);
printf("&ival:\n");
show_pointer(pval);
}//定义int型val,强制类型转换为float和double,在相应类型下输出值和所在地址。
void show_twocomp()
{
/* $begin show-twocomp */
short x = 12345;
short mx = -x;
show_bytes((byte_pointer) &x, sizeof(short));
show_bytes((byte_pointer) &mx, sizeof(short));
/* $end show-twocomp */
}//输出取反后的值和地址
完整代码
/* show-bytes - prints byte representation of data */
/* $begin show-bytes */
#include <stdio.