深入理解计算机系统第三版(家庭作业)

第二章家庭作业

说明:使用的64位小端机。

2.55-2.57

在这里插入图片描述
2.55-2.57的答案写到一起

//
// Created by Gong on 2022/8/2.
//

#include <stdio.h>

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start,size_t len){
    //todo size_t
    for (size_t  i=0;i<len;i++){
        printf("%.2x ",start[i]);
    }
    printf("\n");
}

void show_short(short x){
    show_bytes((byte_pointer)&x,sizeof(short));
}

void show_int(int x){
    show_bytes((byte_pointer)&x,sizeof (int ));
}



void show_long(long x){
    show_bytes((byte_pointer)&x,sizeof(long));
}


void show_float(long x){
    show_bytes((byte_pointer)&x,sizeof(long));
}

void show_double(double x){
    show_bytes((byte_pointer)&x,sizeof(double ));
}

void show_long_double(double x){
    show_bytes((byte_pointer)&x,sizeof(long double ));
}
int main() {
    show_short(0x1234); //34 12
    show_int(0x1234);   //34 12 00 00
    show_long(0x1234);  //34 12 00 00 00 00 00 00
    printf("浮点数:\n");
    show_float(0x1234); //34 12 00 00 00 00 00 00
    show_double(0x1234);//00 00 00 00 00 34 b2 40
    show_long_double(0x1234);//00 00 00 00 00 34 b2 40 40 07 0a e6 fe 7f 00 00
    return 0;
}

输出:
在这里插入图片描述

2.58

编写过程i s _ l i t t l e _ e n d i a n ,当在小端法机器上编译和运行时返回1 ,在大端法机器上编译运行时则返回0 。这个程序应该可以运行在任何机器上,无论机器的字长是多少。

#include <stdio.h>

int is_little_endian() {
    int x = 1;
    char y = (char) x;
    printf("y:%d\n", y);//:y:1
    return y;
}

int main() {
    is_little_endian();
    return 0;
}

2.59

编写一个C表达式,它生成一个字,由x的最低有效字节和y中剩下的字节组成。对于运算数x= O x 8 9 A B C D E F和y = O x 7 6 5 4 3 2 1 0 ,就得到O x 7 6 5 4 3 2 E F。
第一版是自己写的,第二版是网上找到的不错的写法。

第一版:
#include <stdio.h>

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, size_t len) {
    for (size_t i = 0; i < len; i++) {
        printf("%.2x", start[i]);
    }
    printf("\n");
}

void show_int(int x) {
    show_bytes((byte_pointer) &x, sizeof(int));
}

//最大的无符号int
const unsigned int unsigned_int_max = -1; //ffffffff

//低字节掩码
const int mask_low = 0xFF; //000000ff
//较高字节掩码
const int mask_heigh = unsigned_int_max ^ mask_low;//ffffff00  低字节位为0,其余位全为1;

int maskValue(int x, int y) {
    int tempx = x & mask_low;
    int tempy = y & mask_heigh;
    show_int(tempx); //ef000000
    show_int(tempy); //00325476
    int res = tempx | tempy;
    show_int(res); //ef325476
    return res;
};

int main() {
//    show_int(unsigned_int_max);
//    show_int(mask_low); //ff000000
//    show_int(mask_heigh); //00ffffff
    maskValue(0x89ABCDEF, 0x76543210);
}

第二版:
//
// Created by Gong on 2022/7/16.
//
#include <stdio.h>

int main() {

    unsigned x = 0x89ABCDEF;
    unsigned y = 0x76543210;
    unsigned num = (x & 0xff) | (y & ~0xFF);

    printf("%X\n", num); //765432EF
}

2.60

假设我们将一个w位的字中的字节从0 ( 最低位)到w/ 8 - l (最高位)编号。写出下面C函数的代码,它会返回一个无符号值,其中参数x的字节i 被替换成字节b :
unsigned replace_byte (unsigned x, inti, unsigned char b);

以下示例,说明了这个函数该如何工作:
对于0x12345678来说,78:第0位,56:第1位,34:第2位
replace_byte(Ox12345678, 2, OxAB) --> Ox12AB5678
replace_byte(Ox12345678, 0, OxAB) --> Ox123456AB

//
// Created by Gong on 2022/7/16.
//
#include <stdio.h>
typedef unsigned char * byte_pointer;

/**
 * 思路:
 * 先将第i位的byte(后面简称为第i位)设置为0
 * 再将第i位设置为b对应的值
 */
void replace_byte(unsigned x,int i ,unsigned b){
    unsigned mask_low = 0xFF << i*8;//FF0000
    printf("mask_low:%X\n",mask_low);
    unsigned mask_full = ~0;//FFFFFFFF
    printf("mask_full:%X\n",mask_full);//FF00FFFF
    unsigned mask=mask_low ^ mask_full;//12AB5678
    printf("mask:%X\n",mask);
    //将第i位的byte置0
    x = x & mask;
    //将b移动到第i
    b<<=i*8;

    unsigned res ;
    //设置x的第i位
    res =  x | b;
    printf("res:%X\n",res); //12AB5678
}
int main(){
    unsigned x= 0x12345678;
    int i = 2;
    unsigned b = 0xAB;
    replace_byte(x,i,b);
}

第二版:网上找到的不错的写法:

#include <stdio.h>


int replaced_byte(unsigned x, unsigned char b, int i)
{

    int i_times_8 = i << 3;
    unsigned mask = 0xFF << i_times_8;
    return (x & ~mask) | (b << i_times_8);

    /* one-line compact version */
    //return ( x & ~(0xFF << (i << 3))) | (b << (i << 3));
}

int main(){
    int assert_result;

    assert_result = 0x12AB5678;
//    这里用 !(a^b) 来判断两个数是否相等——如果相等,两个数的异或结果位0
    !(assert_result ^ replaced_byte(0x12345678, 0xAB, 2)) &&
    (printf("First example test successful!\n"));

    assert_result = 0x123456AB;
    !(assert_result ^ replaced_byte(0x12345678, 0xAB, 0)) &&
    (printf("Second example test successful!\n"));

}

2.61



//
// Created by Gong on 2022/8/15.
//

#include <stdio.h>

static void echo(char *str){
    printf("%s\n",str);
}

int test_option_a(int x){
    return !~x; //这里的!是为了得到布尔值
}

int test_option_b(int x){
    return !x;
}

int test_option_c(int x){
    return !(x^0xff);
}

int test_option_d(int x){

    int w = sizeof(int) << 3;// <<3 表示乘以2^3=8
    int y = 0xff<<(w-8);

    return  !(x^ y);
}

int main(){
     int w = sizeof(int) <<3;// <<3 表示乘以2^3=8

     int any_bit_eql_1 = ~0;
     int any_bit_eql_0 = 0;
     int any_bit_in_lsb_eql_1 = 0xFF; //least significant byte
     int any_bit_in_msb_eql_0 = 0xFF <<(w - 8); //most significant byte

    (test_option_a(any_bit_eql_1)) && (printf("Option A pass\n"));
    (test_option_b(any_bit_eql_0)) && (printf("Option B pass\n"));
    (test_option_c(any_bit_in_lsb_eql_1)) && (printf("Option C pass\n"));
    (test_option_d(any_bit_in_msb_eql_0)) && (printf("Option D pass\n"));

    printf("%d",!(0x0f&0xff));
}

2.62

第一版:

//
// Created by Gong on 2022/8/5.
//
#include <stdio.h>

int int_shifts_are_arithmetic() {
    int w = sizeof(int) * 8;
    int x = -1;
    return !!(x >> w); //!!是为了取得bool值,可以省略
}

int main() {
    int_shifts_are_arithmetic() && printf("机器使用算数右移");
}
第二版

网上找的不错的参考

//
// Created by Gong on 2022/8/5.
//
#include <stdio.h>

int int_shifts_are_arithmetic() {
    int x = ~0;
    return (x >> 1) == x;
}

int int_shifts_are_logical() {
    int x = ~0;
    x >>= 1;

    return !!(~x);
}

int main() {

    int_shifts_are_arithmetic() && printf("机器使用算数右移");
    int_shifts_are_logical() && printf("机器使用逻辑右移");//本人未在使用逻辑右移的机器上测试

}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ICS是指深入理解计算机系统(Introduction to Computer Systems)课程,它是计算机科学学科中的一门重要课程。ICS课程旨在培养学生对于计算机系统的全面理解,使他们能够更加深入地理解计算机的工作原理和操作系统的基本概念。 在ICS课程中,学生将学习计算机组成原理、汇编语言、虚拟内存、I/O与文件系统以及网络等方面的知识。通过学习这些内容,学生将会掌握计算机硬件和软件之间的交互过程,理解计算机系统的层次结构和工作流程。 ICS课程的整体组织和教学方法也对学生的学习起到了积极的促进作用。该课程通常会以理论与实践相结合的方式进行教学,通过编写和调试简单的C程序,帮助学生更好地理解并应用所学知识。此外,ICS课程还会进行一些实验和项目作业,以进一步巩固学生的理论知识和动手能力。 通过ICS课程的学习,学生可以全面了解计算机系统的机制和操作系统的工作原理。这对于计算机科学专业的学生来说,是非常重要的基础知识。ICS课程的学习可以帮助学生更好地理解计算机的运行原理,培养他们对计算机系统的整体观念和问题解决能力。此外,ICS课程还为学生打下了进一步学习操作系统、编译原理等高级课程的基础。 总之,ICS深入理解计算机系统课程通过全面介绍计算机系统的原理和操作系统的基本概念,培养学生对计算机系统的全面理解和应用能力,为他们计算机科学学科的深入学习和职业发展奠定了坚实的基础。 ### 回答2: ICS(深入理解计算机系统)是一门以探索计算机系统底层原理和工作方式为主题的课程。通过学习ICS,我们可以深入了解计算机组成、存储器层次结构、虚拟内存、体系结构、操作系统和编译器等方面的知识。 在ICS的学习过程中,我们首先学习了计算机系统的基本原理和组成部分。我们了解了计算机硬件和软件之间的交互作用,以及计算机系统的各个层次结构。我们了解了计算机系统如何将高级语言代码转化为可执行的机器语言指令,以及如何将这些指令转化为对硬件进行操作的控制信号。 接着,我们学习了存储器层次结构和缓存技术。我们了解了高速缓存如何提高计算机系统的性能,以及如何进行高效地数据传输和存储管理。我们还学习了虚拟内存的概念和实现原理,了解了操作系统如何管理程序和数据的存储,以及如何实现进程间的内存共享。 在学习ICS的过程中,我们还了解了计算机系统的体系结构和指令集。我们了解了不同体系结构的特点和应用,并学习了指令集的设计和实现。我们还学习了计算机系统的性能评测和优化技术,以及如何通过并行处理和其他技术来提高系统的性能。 最后,我们学习了操作系统和编译器的工作原理和设计方法。我们了解了操作系统如何管理计算机系统的资源,提供各种服务,并实现进程的调度和同步。我们还学习了编译器如何将高级语言代码转化为机器语言,并进行代码优化和生成可执行文件。 总而言之,ICS是一门重要的计算机科学课程,通过深入学习计算机系统的底层原理和工作方式,我们可以更好地理解计算机系统,为我们在软件开发和系统设计领域的工作提供坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值