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. 28、springboot整合RabbitMQ(2)

    1.监听 1.1.监听队列 如订单系统和库存系统 订单系统下订单之后将消息存放在消息队列中 库存系统需要时刻进行监听消息队列的内容,有新的订单就需要进行库存相关的操作   此时模拟监听消息队列中的Bo ...

  2. Spring(一)之概括与架构

    个人说明: 下面有一部分引用该链接:https://www.tutorialspoint.com/spring/spring_architecture.htm 另外一部分加上我个人的使用经验和体会 之 ...

  3. jQuery.mobile.changePage的参数

    选项 类型:对象 属性: allowSamePageTransition(默认值:假的) 类型:布尔 默认情况下,changePage()忽略请求更改为当前活动页面.将此选项设置为true,则允许该请 ...

  4. PAT——1052. 卖个萌

    萌萌哒表情符号通常由“手”.“眼”.“口”三个主要部分组成.简单起见,我们假设一个表情符号是按下列格式输出的: [左手]([左眼][口][右眼])[右手] 现给出可选用的符号集合,请你按用户的要求输出 ...

  5. TabActivity 、fragemnt+fragment 和 Fragment+Viewpager 优缺点

    1 TabActivity : 1 过时了 . 2 activity . 是作为android的四大组件...                   重量级的家伙   ViewGroup   : 特别麻 ...

  6. pl/sql下载

    详解Oracle客户端工具:PL/SQL工具下载: 下载地址:http://www.oraclejsq.com/article/010100114.html

  7. Oracle特有函数 case when decode exists 分页rownum

    select * from EMP eselect * from dept dselect * from salgrade s--Oracle特有函数 case whenselect case 2 w ...

  8. 添加一个js扩展方法

    String.prototype.repeatify=String.prototype.repeatify || function(times){ var str=''; for(var i=0;i& ...

  9. 今天在Qt子界面中的Button,转到槽转不过去,报错Qt The class containing 'Ui::MainWindow' could not be found in...

    在网上查了原因,因为我在修改button的名字时,没选中button,选中了子界面对话框Dialog,然后修改了名字,又没有改回去,所以button转到槽报错. 参考网站: https://zhida ...

  10. BZOJ 1941: [Sdoi2010]Hide and Seek(k-d Tree)

    Time Limit: 16 Sec  Memory Limit: 162 MBSubmit: 1712  Solved: 932[Submit][Status][Discuss] Descripti ...