20155212 ch02 课下作业

T1

  • 题目

    参考附图代码,编写一个程序 “week0601学号.c",判断一下你的电脑是大端还是小端

  • 相关知识

    • 小端法:最低有效字节在最前面
    • 大端法:最高字节在最前面
  • 思路

    • 将参数的指针强制类型转换为unsigned char *代码利用强制转换类型告诉机器,程序应该把这个指针看成指向一个字节序列,而不是指向一个原始数据类型的对象。然后这个指针会被看成是对象使用的最低字节地址。
  • 代码

#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));20155212 ch02 课下作业
} 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);
} void main() {
int val;
scanf("%d", &val);
test_show_bytes(val);
}
  • 运行结果

  • 结果分析

    参数12345的十六进制表示应该是0x00003039,但是实际显示最低有效字节0x39最先输出,说明这是小端机器。

T2

  • 题目

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

    2. 参考教材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);
}
  • 运行结果

  • 推导

    5212具有二进制表示[1010001011100],将二进制小数点左移13位,得到规格化表示1.010001011100 x 2^13。为了用IEEE单精度形式编码,舍弃开头的1,并在末尾增加10个0,来构造小数字段,得到二进制表示[10100010111000000000000]。为了构造阶码字段,用13加上偏置量127,得到140,其二进制表示为[10001100],加上符号位0,即可得到二进制的浮点表示[01000101101000101110000000000000]。

T3

  • 题目

    1. 编写一个程序 “week0603学号.c",运行下面代码:

      1  short int v = -学号后四位
      2 unsigned short uv = (unsigned short) v
      3 printf("v = %d, uv = %u\n ", v, uv);
    2. 在第三行设置断点用gdb调试,用p /x v; p /x uv 查看变量的值,提交调试结果截图,要全屏,要包含自己的学号信息

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

  • 相关知识

    • 有符号和无符号数之间的转换

      • C语言允许在各种不同的数字数据类型之间做强制类型转换。
      • 强制类型转换的结果保持位值不变,只是改变了解释这些位的方式。
    • gdb调试
      • b (line number):设置行断点
      • run:运行
      • p:print
      • /x:十六进制
  • 代码

#include<stdio.h>

void main(){
short int v = -5212;
unsigned short uv = (unsigned short) v;
printf("v = %d, uv = %u\n ", v, uv);
}
  • 运行结果

  • 分析

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

P97 2.96

  • 题目

  • 相关知识

    - IEEE浮点表示

  • 代码
#include <stdio.h>

typedef unsigned float_bits;

int float_f2i(float_bits f){
unsigned sign, exp, frac, last_bit;
int i;
sign = f >> 31;
exp = (f >> 23) & 0xff;
frac = f & 0x7fffff;
if (exp == 158 && frac == 0 && sign == 1)
i = 0x80000000;
else if (exp > 157 || exp == 0xff)
i = 0x80000000;
else if (exp < 126)
i = 0;
else{
exp -= 127;
frac |= 0x800000;
if (exp > 23){
exp -= 23;
frac <<= exp;
}else if (exp < 23){
exp = 23 - exp;
frac >>= exp;
}
if (sign == 1)
i = (~frac) + 1;
else
i = frac;
}
return i;
}
void main(){
float f;
unsigned i;
int j, k; for (i = 0x3fbfff70U; i <= 0xffffffffU; i++)
{
f = *(float *)&i;
j = (int)f;
k = float_f2i(i);
printf("原值:%f \t 机器运算:%d \t 函数运算:%d\n", f, j, k);
}
}
  • 运行结果

P97 2.97

  • 题目

  • 代码
#include <stdio.h>

typedef unsigned float_bits;
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("\t");
} float_bits float_i2f(int x) {
unsigned shiftLeft=0;
unsigned afterShift, tmp, flag;
unsigned absX=x;
unsigned sign=0;
if (x==0)
return 0;
if (x<0){
sign=0x80000000;
absX=-x;
}
afterShift=absX;
while (1){
tmp=afterShift;
afterShift<<=1;
shiftLeft++;
if (tmp & 0x80000000)
break;
}
if ((afterShift & 0x01ff)>0x0100)
flag=1;
else if ((afterShift & 0x03ff)==0x0300)
flag=1;
else
flag=0;
return sign+(afterShift>>9)+((159-shiftLeft)<<23)+flag;
} void main(){
int x;
unsigned i,k;
float j; for (i = 0x3fbfff70U; i <= 0xffffffffU; i++){
x = *(int *)&i;
printf("原值:");
show_bytes((byte_pointer) &x, sizeof(int));
j=(float)i;
printf("机器运算:");
show_bytes((byte_pointer) &j, sizeof(float));
k=float_i2f(i);
printf("函数运算:");
show_bytes((byte_pointer) &k, sizeof(unsigned));
printf("\n");
}
}
  • 运行结果

20155212 ch02 课下作业的更多相关文章

  1. 2018-2019-1 20165205 ch02 课下作业

    ch02 课下作业 2.96 代码 #include <stdio.h> #include <stdlib.h> typedef unsigned float_bits; fl ...

  2. 20165302 ch02 课下作业

    20165302 ch02 课下作业 作业内容 补充完成课上测试(不能只有截图,要有分析,问题解决过程,新学到的知识点) 完成教材 p97 2.96 2.97,要有完备的测试 发一篇相关内容的博客, ...

  3. 2018-2019-1 20165330 《信息安全系统设计基础》第六周课上测试ch02&课下作业

    课上测试 测试-3-ch02 任务详情 编写一个程序 "week0203学号.c",运行下面代码: 1 short int v = -学号后四位 2 unsigned short ...

  4. 20165311 ch02 课下作业

    补充完成课上测试(不能只有截图,要有分析,问题解决过程,新学到的知识点) 完成教材 p97 2.96 2.97,要有完备的

  5. 20155212 ch03 课下作业

    T4 题目 通过输入gcc -S -o main.s main.c 将下面c程序"week0603学号.c"编译成汇编代码 int g(int x){ return x+3; } ...

  6. ch02 课下作业

    2.96遵循位级浮点编码规则,实现具有如下原型的函数: /* *Compute (int) f. *If conversion causes overflow or f is NaN, return ...

  7. 20155331 ch02 课下作业

    2.96 遵循位级浮点编码规则,实现具有如下原型的函数: /* *Compute (int)f. *If conversion cause overflow or f is NaN, return 0 ...

  8. 20155338 ch02 ch03课下作业

    20155338 ch02 ch03课下作业 要求: 1.补充完成课上测试(不能只有截图,要有分析,问题解决过程,新学到的知识点) 课上测试-3-ch02 1.编写一个程序 "week060 ...

  9. 20175221 MyCP(课下作业,必做)

    MyCP(课下作业,必做) 任务详情 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: - java MyCP -tx XXX1.txt XXX2 ...

随机推荐

  1. java.lang.UnsatisfiedLinkError: /usr/openv/java/jre/lib/amd64/libawt_xawt.so: libXtst.so.6: cannot open shared object file: No such file or directory

    解决办法: 在radhat 或者centos系统中运行一下命令即可:yum install libXext.x86_64yum install libXrender.x86_64yum install ...

  2. [COGS 0407][NOIP 2009] 靶形数独

    407. [NOIP2009] 靶形数独 ★★   输入文件:sudoku.in   输出文件:sudoku.out   简单对比时间限制:5 s   内存限制:128 MB [问题描述] 小城和小华 ...

  3. JavaScript的事件的处理函数(鼠标,键盘,HTML)

    事件处理函数概述 JavaScript 可以处理的事件类型为:鼠标事件.键盘事件.HTML 事件 所有的事件处理函数都会都有两个部分组成,on + 事件名称,例如 click 事件的事件处理函数就是: ...

  4. CF 553E Kyoya and Train

    题目分析 期望\(\text{dp}\). 设\(f_{i,j}\)表示在第\(j\)个时刻从\(i\)点出发,到达终点的期望花费. 有转移方程: \[ f_{x,t}=\min_{(x,y)\in ...

  5. 【C语言天天练(二二)】位操作

    C的位运算符 1.二进制反码或按位取反:~ ~(10011010) = (01100101). 假设val是一个unsigned char,~val不改名原来val的值. 2.位与:& 二进制 ...

  6. python open 追加

    今天操作失误,导致home目录没空间了,结果跑了3天的程序断了,还好代码可以重新运行. 读写的文件使用追加方式: # a # 打开一个文件用于追加(只写),写入内容为str # 如果该文件已存在,文件 ...

  7. freemarker模板加载TemplateLoader常见方式

    使用过freemarker的肯定其见过如下情况: java.io.FileNotFoundException: Template xxx.ftl not found. 模板找不到.可能你会认为我明明指 ...

  8. Jquery mobile 自定义 返回按钮 data-rel="back"

    data-rel="back" 第一个页面 主页面 studentmaster.html  通过下面js脚本跳转到详情页面 window.location.href="s ...

  9. 利用maven开发springMVC项目(三)——数据库配置

    前两节介绍了开发环境的搭建以及框架的配置 现在主要介绍在eclipse中如何将SpringMVC.hibernate.mysql数据库结合起来. 数据库配置 下面,就要通过一个简单的例子,来介绍Spr ...

  10. PAT——1036. 跟奥巴马一起编程

    美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正 ...