题目一
- 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("
");
}
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的笔记本电脑是小端
");
else
printf("学号20165230的笔记本电脑是大端
");
}
void main() {
int val;
scanf("%d", &val);
test_show_bytes(val);
}
运行结果
题目二
-
调用附图代码,编写一个程序 “week0202学号.c",用show_int(), show_float()打印一下你的4位学号,参考教材P33打印出匹配的位序列。
-
提交运行结果截图,要全屏,要包含自己的学号信息
-
课下把代码推送到代码托管平台*
-
参考教材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("
");
-
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("
");
}
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("
");
}
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("
");
}
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("
");
show_float(fval);
}
void main() {
int val;
scanf("%d", &val);
test_show_bytes(val);
}
运行结果
第三题
- 由于前两题花的时间过多,导致第三题没有时间完成,在此将第三题补充完成。
- 编写一个程序 “week0203学号.c",运行下面代码:
short int v = -学号后四位
unsigned short uv = (unsigned short) v
printf("v = %d, uv = %u
", v, uv);
-
在第三行设置断点用gdb调试,用p /x v; p /x uv 查看变量的值,提交调试结果截图,要全屏,要包含自己的学号信息
-
分析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
", v, uv);
}
调试结果
分析
数值可能会改变,但是位模式不变