欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

我的的一些家庭作业

程序员文章站 2022-07-10 15:03:04
...

去年因为自身心理原因回家修养.家里比深圳冷许多,所以一直都在运动锻炼身体,荒废了自己的学习.
现在天气暖和了,要天天向上了.下面是自己写的一些小例子,也可以说是作<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;
}
相关标签: c CSAPP Linux