第1章 实验基本信息 - 4 -
1.1 实验目的 - 4 -
1.2 实验环境与工具 - 4 -
1.2.1 硬件环境 - 4 -
1.2.2 软件环境 - 4 -
1.2.3 开发工具 - 4 -
1.3 实验预习 - 4 -
第2章 实验环境建立 - 5 -
2.1 UBUNTU下CODEBLOCKS安装 - 5 -
2.2 64位UBUNTU下32位运行环境建立 - 5 -
第3章 C语言的数据类型与存储 - 6 -
3.1 类型本质(1分) - 6 -
3.2 数据的位置-地址(2分) - 6 -
3.3 MAIN的参数分析(2分) - 6 -
3.4 指针与字符串的区别(2分) - 6 -
第4章 深入分析UTF-8编码 - 8 -
4.1 提交UTF8LEN.C子程序 - 8 -
4.2 C语言的STRCMP函数分析 - 8 -
4.3讨论:按照姓氏笔画排序的方法实现 - 8 -
第5章 数据变换与输入输出 - 9 -
5.1 提交CS_ATOI.C - 9 -
5.2 提交CS_ATOF.C - 9 -
5.3 提交CS_ITOA.C - 9 -
5.4 提交CS_FTOA.C - 9 -
5.5 讨论分析OS的函数对输入输出的数据有类型要求吗 - 9 -
第6章 整数表示与运算 - 10 -
6.1 提交FIB_DG.C - 10 -
6.2 提交FIB_LOOP.C - 10 -
6.3 FIB溢出验证 - 10 -
6.4 除以0验证: - 10 -
第7章 浮点数据的表示与运算 - 11 -
7.1 正数表示范围 - 11 -
7.2浮点数的编码计算 - 11 -
7.3特殊浮点数值的编码 - 11 -
7.4浮点数除0 - 11 -
7.5 FLOAT的微观与宏观世界 - 11 -
7.6 讨论:任意两个浮点数的大小比较 - 11 -
第8章 舍位平衡的讨论 - 12 -
8.1 描述可能出现的问题 - 12 -
8.2 给出完美的解决方案 - 12 -
第9章 总结 - 13 -
9.1 请总结本次实验的收获 - 13 -
9.2 请给出对本次实验内容的建议 - 13 -
参考文献 - 14 -
熟练掌握计算机系统的数据表示与数据运算
通过C程序深入理解计算机运算器的底层实现与优化
掌握VS/CB/GCC等工具的使用技巧与注意事项
X64 CPU;2GHz;2G RAM;256GHD Disk 以上
Windows7 64位以上;VirtualBox/Vmware 11以上;Ubuntu 16.04 LTS 64位/优麒麟 64位
Visual Studio 2010 64位以上;CodeBlocks;vi/vim/gpedit+gcc
上实验课前,必须认真预习实验指导书(PPT或PDF)
了解实验的目的、实验环境与软硬件工具、实验操作步骤,复习与实验有关的理论知识。
采用sizeof在Windows的VS/CB以及Linux的CB/GCC下获得C语言每一类型在32/64位模式下的空间大小
Char /short int/int/long/float/double/long long/long double/指针
编写C程序,计算斐波那契数列在int/long/unsigned int/unsigned long类型时,n为多少时会出错
(1).先用递归程序实现,会出现什么问题?
(2).再用循环方式实现。
写出float/double类型最小的正数、最大的正数(非无穷)
按步骤写出float数-1.1在内存从低到高地址的字节值-16进制
按照阶码区域写出float的最大密度区域范围及其密度,最小密度区域及其密度(区域长度/表示的浮点个数)
CodeBlocks运行界面截图:编译、运行hellolinux.c
在终端下,用gcc的32位模式编译生成hellolinux.c。执行此文件。
Linux及终端的截图。
Win/VS/x86 | Win/VS/x64 | Win/CB/32 | Win/CB/64 | Linux/CB/32 | Linux/CB/64 | |
---|---|---|---|---|---|---|
char | 1 | 1 | 1 | 1 | 1 | 1 |
short | 2 | 2 | 2 | 2 | 2 | 2 |
int | 4 | 4 | 4 | 4 | 4 | 4 |
long | 4 | 4 | 4 | 4 | 4 | 8 |
long long | 8 | 8 | 8 | 8 | 8 | 8 |
float | 4 | 4 | 4 | 4 | 4 | 4 |
double | 8 | 8 | 8 | 8 | 8 | 8 |
long double | 8 | 8 | 12 | 16 | 12 | 16 |
指针 | 4 | 8 | 4 | 8 | 4 | 8 |
C编译器对sizeof的实现方式:
sizeof不是函数,而是运算符,C语言中的关键字;
它由编译器来计算,编译阶段就计算出结果了,在运行时就只是一个常量。编译阶段可以确定数据类型,根据数据类型换算数据的长度。
打印x、y、z输出的值:截图1
截图1
反汇编查看x、y、z的地址,每字节的内容:截图2,标注说明
x的地址是0x0804a020
y的地址是0x08048528
z的地址是0x0804a024
反汇编查看x、y、z在代码段的表示形式。截图3,标注说明
x存在0x804a020,mov 0x8048528,%eax 将地址存入%eax语句
y存在0x8048528,这一地址经过flfl与fstpl操作将地址压入-0x10(%ebp)中
z存在0x804a024,这一地址push进栈以供puts使用
x与y在汇编阶段转换成补码与ieee754编码。
数值型常量与变量在存储空间上的区别是:
数值型常量一般存放在.rodata段、常量存储区,有的立即数直接编码在指令里,存放在代码段(.text)中;数值型变量若为未初始化的全局变量将存放在.bss段(在运行时将为.bss段分配空间),若为初始化的全局变量以及初始化的静态变量将存放在.data段,函数内的局部变量(用户临时创建的)、传递的函数参数一般存放在栈上,动态分配的变量在堆中。
字符串常量与变量在存储空间上的区别是:
指针方式创建的字符数组,是常量字符串;方括号([])方式创建的字符数组是字符串变量。
未初始化的全局字符串存放在bss段;全局的初始化的字符串常量内容存储在rodata段;全局初始化后的字符串变量存储在data段;函数内的局部变量(用户临时创建的)或常量中,字符串内容存放在rodata段,变量或常量指针放入栈中;静态字符串变量存放在data段。
常量表达式在计算机中处理方法是:
编译阶段尽量将左移右移代替乘除法,汇编阶段计算出常量表达式的值
反汇编查看x、y、z的地址,argc的地址,argv的地址与内容,截图4
调试过程中
首先传递参数:
argv[0]内容为:/mnt/hgfs/hitics/xyzfuben/xyz
存放在:0xffffd181
argv[1]内容为:-学号
存放在:0xffffd19f
argv[2]内容为:身份证号
存放在:0xffffd1ab
argv[3]内容为:学号-姓名
存放在:0xffffd1c0
cstr的地址与内容截图,pstr的内容与截图,截图5
pstr修改内容会出现什么问题:用学号+姓名初始化后,若以 **pstr = “…”/…为身份证号/这一形式赋值,将会报错,因为原先pstr的值(学号+姓名)存储在常量区,这种赋值语句会意图修改常量区的值,不合法;若以pstr = “…”/…为身份证号/的形式赋值是合法的,但此时指针指向位置发生改变,即指针指向了常量区另一个地方,该地方存有后赋值的字符串常量。
#include <stdio.h>
int utf8len(char* cstr) {char *s = cstr;int length = 0;char num;while (*s != '