`

我的<CSAPP>的一些家庭作业

阅读更多

去年因为自身心理原因回家修养.家里比深圳冷许多,所以一直都在运动锻炼身体,荒废了自己的学习.
现在天气暖和了,要天天向上了.下面是自己写的一些小例子,也可以说是作<CSAPP>的一些作业所随便写的一些东西.


1.自定义的define.h的头文件的部分内容
#include <stdio.h>
#include <limits.h>
#include <stdint.h>
#include <stdlib.h>

#define BITS_LENGTH_OF_BYTE 8u

// 检测乘法是否溢出-1
int tmul_ok(int x, int y)
{
    int result = x * y;
    return !x || result / x == y;
}

// 检测乘法是否溢出-2
int tmul_ok_1(int x, int y)
{
    int64_t result = x * y;
    return !x || !y || !(result & INT_MAX);
}

int div16(int x)
{
    int bias = (x >> 31) & 0xf;
    return (x + bias) >> 4;
}

// 判断小端字节序
int little_endian_ok()
{
    unsigned i = 1;
    unsigned char *pi = (unsigned char *)&i;

    return *pi & 1;
}

/* 输出指定基本数据类型的-位模式;
针对小端字节序的系统,从符合人类书写习惯的高位开始输出 */
void show_bits(const char *start_addr, unsigned byte_length)
{
    unsigned char mask_no = 1U;

    for (unsigned i = byte_length; i > 0; i--)
    {
        unsigned blob_var = BITS_LENGTH_OF_BYTE; // blob => bits length of byte
        unsigned char c = *(start_addr + i - 1);
        for (; blob_var > 0; blob_var--)
        {
            printf("%u ", (c >> (blob_var - 1)) & mask_no);
        }
    }

    printf("\n");
}


2.判断自己系统是否是小端字节序

显示是1就说明是小端字节序的系统

#include <stdio.h>
#include "define.h"

int main()
{
    printf("小端字节序:%d\n", little_endian_ok());
    return 0;
}


3.根据输入的数字输出-位模式

简单实现的小东西,所以目前只支持32位和64位的整形数字,感兴趣的同学请自行拓展,拓展好了请发个留言共同进步.

#include <stdio.h>

#include "define.h"

int main(int arg_l, char *args[])
{

    if (arg_l < 2)
    {
        printf("参数输入错误");
        return 0;
    }

    
    // int byte_length = *((int *)args[2]);
    int byte_length = atoi(args[2]);
    const char *start_addr;
    if (byte_length == 4) {
        int i = atoi(args[1]);
        start_addr = (char *)&i;
    }
    else {
        long l = atol(args[1]);
        start_addr = (char *)&l;
    }
    
    show_bits(start_addr, byte_length);
    return 0;
}
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics