zoukankan      html  css  js  c++  java
  • 《CSAPP》读书杂记

    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("
    ");
    }
    
    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
    ", 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形式)以十六进制形式输出;若指针是以char形式表示,则转换为十六进制时会认为有符号,所以会出现补全ffffff的情况。show_float()类似。

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

    对于show_pointer函数,传递的是 int*指针,实参强制转换为void*指针,而&x转换为指向void*指针的指针,即void**指针,要访问void*指针的内容,需要void*指针的地址,即void**指针和void*指针的长度。之后情况与上面类似。

     

    2. 问题2.27

    写一个判断无符号加法是否溢出的函数

    int uadd_ok(unsigned x, unsigned y)
    {
        unsigned sum = x + y;
        return sum >= x;
    }

    若无溢出,则 sum >= x 恒成立

    若溢出,则 sum = x + y - 2^w,由于 y < 2^w,则 sum < x

  • 相关阅读:
    c语言之排序
    c语言中的break 和 continue语句
    c语言之循环
    c语言之选择
    使用函数封装代码
    C语言的运算符
    判断两个对象是否相等:hashcode
    更新线上的资源存在删除和添加的情况-要避免空窗期的实现方法
    变量只能设置一次方法
    JAVA-获取系统信息:内存和系统、PID、内核
  • 原文地址:https://www.cnblogs.com/Azurewing/p/4050857.html
Copyright © 2011-2022 走看看