CSAPP:show-bytes(gcc)

    xiaoxiao2024-12-12  15

    该程序可用于测试不同类型的数据在计算机内存储所需要的字节数,以及在每一个字节里存储的数据,并能够看出所使用的计算机是大端模式还是小端模式。

    代码全览

    /* show-bytes - prints byte representation of data */ /* $begin show-bytes */ #include <stdio.h> /* $end show-bytes */ #include <stdlib.h> #include <string.h> /* $begin show-bytes */ typedef unsigned char *byte_pointer; //typedef char *byte_pointer; //typedef int *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"); } 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 *)); } /* $end show-bytes */ /* $begin test-show-bytes */ 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); } /* $end test-show-bytes */ void simple_show_a() { /* $begin simple-show-a */ int val = 0x87654321; byte_pointer valp = (byte_pointer) &val; show_bytes(valp, 1); /* A. */ show_bytes(valp, 2); /* B. */ show_bytes(valp, 3); /* C. */ /* $end simple-show-a */ } void simple_show_b() { /* $begin simple-show-b */ int val = 0x12345678; byte_pointer valp = (byte_pointer) &val; show_bytes(valp, 1); /* A. */ show_bytes(valp, 2); /* B. */ show_bytes(valp, 3); /* C. */ /* $end simple-show-b */ } void float_eg() { int x = 3490593; float f = (float) x; printf("For x = %d\n", x); show_int(x); show_float(f); x = 3510593; f = (float) x; printf("For x = %d\n", x); show_int(x); show_float(f); } void string_ueg() { /* $begin show-ustring */ const char *s = "ABCDEF"; show_bytes((byte_pointer) s, strlen(s)); /* $end show-ustring */ } void string_leg() { /* $begin show-lstring */ const char *s = "abcdef"; show_bytes((byte_pointer) s, strlen(s)); /* $end show-lstring */ } 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 */ } int main(int argc, char *argv[]) { int val = 12345; if (argc > 1) { val = strtol(argv[1], NULL, 0); printf("calling test_show_bytes\n"); test_show_bytes(val); } else { printf("calling show_twocomp\n"); show_twocomp(); printf("Calling simple_show_a\n"); simple_show_a(); printf("Calling simple_show_b\n"); simple_show_b(); printf("Calling float_eg\n"); float_eg(); printf("Calling string_ueg\n"); string_ueg(); printf("Calling string_leg\n"); string_leg(); } return 0;

    代码说明

    #include <stdio.h> #include <stdlib.h> #include <string.h>

    “#”标明该行指令为预处理指令,“< >”里的内容是编译器标配的头文件,若为“ " " ”引用,则说明是用户自己保存在本地的头文件。 stdio.h:包含scanf(输入)和printf(输出)等函数 stdlib.h:包含malloc(申请空间)和free(释放空间)等函数 string.h:包含用于字符串处理的函数

    typedef unsigned char *byte_pointer; //typedef char *byte_pointer; //typedef int *byte_pointer;

    “typedef”是一个关键字,作用是为某种数据类型定义新名字。例如:给unsigned char *取名为byte_pointer (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");

    “%p”表示输出地址 “%x”表示输出十六进制 “%.2x”确保整数都以两位16进制数输出

    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 *)); }

    将不同类型的x都强制类型转化为byte_pointer即unsigned char **型,用sizeof(关键字)表示数据占用的字节数。

    int main(int argc, char *argv[])

    argc :参数的个数 *argv[ ]:指针数组,存参数

    运行结果

    不带参数

    参数为1073741824

    1.

    typedef unsigned char *byte_pointer;

    2.

    typedef int *byte_pointer;

    3.

    typedef char *byte_pointer;

    这三行代码改变的是start[i]寻址的字节大小。

    最新回复(0)