20165230 ch02 课上测试

题目一

  • 1.参考附图代码,编写一个程序 “week0201学号.c",判断一下你的电脑是大端还是小端。
  • 2.提交运行结果”学号XXXX的笔记本电脑是X端“的运行截图,要全屏,包含自己的学号信息
  • 3.把代码推送到代码托管平台**

相关知识点

  • 大端字节序 : 高字节序存于内存的低地址;低字节序存于内存的高地址。

  • 小端字节序 : 高字节序存于内存的高地址;低字节序存于内存的低地址。

  • 代码

#include <stdio.h>

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, size_t len) {
    size_t i;
    for(i=0; i<len; i++)
        printf(" %.2x", 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 *));
}

void test_show_bytes(int val) {
    int ival=val;
    float fval=(float)ival;
    int *pval=&ival;
    show_int(ival);
    show_float(fval);
    show_pointer(pval);
    int num = 1;
    if (ival&num == 1)
        printf("学号20165230的笔记本电脑是小端\n");
    else
        printf("学号20165230的笔记本电脑是大端\n");

}

void main() {
    int val;
    scanf("%d", &val);
    test_show_bytes(val);
}

运行结果

题目二

  1. 调用附图代码,编写一个程序 “week0202学号.c",用show_int(), show_float()打印一下你的4位学号,参考教材P33打印出匹配的位序列。

  2. 提交运行结果截图,要全屏,要包含自己的学号信息

  3. 课下把代码推送到代码托管平台*

  4. 参考教材p82,给出出匹配的位序列的推导过程

相关知识点

  • 输出位序列。(代码如下)
int i, j;
for(i=0; i<11; i++)
    printf(" ");
for(i=0; i<len; i++){
    for(j=0; j<8; j++){
        printf("%d", (start[i]>>j) & 0x1);
    }
}
printf("\n");
  • IEEE浮点表示

  • 代码

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

typedef unsigned char *byte_pointer;

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

void show_int(int x) {
    size_t len=sizeof(int);
    show_bytes((byte_pointer) &x, len);
    byte_pointer start=(byte_pointer) &x;
    int i, j;
    for(i=0; i<11; i++)
        printf(" ");
    for(i=0; i<len; i++){
        for(j=0; j<8; j++){
            printf("%d", (start[i]>>j) & 0x1);
        }
    }
    printf("\n");
}

void show_float(float x) {
    size_t len=sizeof(float);
    show_bytes((byte_pointer) &x, len);
    byte_pointer start=(byte_pointer) &x;
    int i, j;
    for(i=0; i<len; i++){
        for(j=0; j<8; j++){
            printf("%d", (start[i]>>j) & 0x1);
        }
    }
    printf("\n");
}

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;
    show_int(ival);
    int i;
    for(i=0;i<11;i++){
        printf(" ");
    }
    for(i=0;i<13;i++)
        printf("*");
    printf("\n");
    show_float(fval);
}

void main() {
    int val;
    scanf("%d", &val);
    test_show_bytes(val);
}

运行结果

第三题

  • 由于前两题花的时间过多,导致第三题没有时间完成,在此将第三题补充完成。
  1. 编写一个程序 “week0203学号.c",运行下面代码:
   short int v = -学号后四位
   unsigned short uv = (unsigned short) v
   printf("v = %d,  uv = %u\n ", v, uv);
  1. 在第三行设置断点用gdb调试,用p /x v; p /x uv 查看变量的值,提交调试结果截图,要全屏,要包含自己的学号信息

  2. 分析p /x v; p /x uv 与程序运行结果的不同和联系

代码

#include<stdio.h>  
void main()
{
  short int v = -5230;    
  unsigned short uv = (unsigned short) v;     
  printf("v = %d,  uv = %u\n ", v, uv); 
}

调试结果

分析

数值可能会改变,但是位模式不变

总结

posted @ 2018-10-16 20:24  tiankunye  阅读(112)  评论(0编辑  收藏  举报