您的位置:首页 > 其它

信息的表示和处理(1)

2016-06-10 16:40 260 查看

2.1 信息存储

上一节我们说到计算机领域一个重要的抽象 --- 虚拟存储器, 其中每一个字节都有一个数字作为唯一的标识, 这也就是所谓的地址。所有的地址的集合叫做虚拟地址空间, 用来给机器程序一个统一的概念性映像。我们用它来完成对被划分给不同的程序对象的存储区空单元的管理。

2.11 十六进制表示法

hexadecimal常常用来表示字节, 在C语言中0x或者是0X开头表示这个数字常量是十六进制,从1到16分别是1-9a-f(大小写均可)。

作业比较简单都是一些关于进制转化的就不做了。

2.12 字

计算机的字长用来指明计算机整数和指针的normal size, 虚拟地址就是以字来编码的, 所以字长同时也决定了虚拟地址空间的最大大小,比如32位字长的计算机最大的虚拟地址空间是0-2^32-1也就是4GB。

2.13 数据大小

c语言中各类型的准确字节数其实取决于机器和编译器,程序员应该尽量使得所使用数据类型对于其字节数不敏感。

2.14 寻址和字节顺序

对于跨越多字节的程序对象, 我们可以通过两个重要的因素来确定他们, 一个是对象的地址(跟确切的说我感觉是指针, 因为还必须知道这个数据对象的具体类型), 另外一个是字节排列的顺序。

比如对于一个四字节整数而言,从高地址到低地址可以是【x3, x2, x1, x0 】此时x3是msb, 这就是所谓的小端, 它将最高有效位存放在高地址位。 而大端法则恰恰相反, 随着地址的减小位级却在不断增大(可以想象一下你要把一个字符串中保存的整数分析正整数--》“1234 ”, 1是msb, 但1处在低地址位)。

这里可以写一个简单的程序来测试自己的系统到底是小端还是大端。

printf("%x\n", (char)(0x1234));

理论上这一行代码就够了, 如果是小端的话输出结果应该是34。

2.15 表示字符串

最常见的字符编码是ascii字符码, 因为每一个字符都可以用单个字节表示, 所以ascii码不受字节顺序的影响, 这也是为什么文本数据比二进制数据具有更好的平台独立性。

2.16 表示代码

源代码本身作为文本文件是多平台的, 但是一旦编译之后生成了目标代码, 那么就失去了跨平台的能力, 因为不同平台的机器指令的编码方式不同。

2.17 布尔代数简介

布尔代数也就是关于0(false)和1(true)的一些运算, 比如 & | ~ ^等等。但是在实际的编程实践中, 这种正对单个0和1的逻辑运算是远远不够的, 所以人们将之扩展到位了位向量运算, 位向量就是有固定长度w, 由0和1组成的串(实际上就是提供了对于多位二进制数的运算支持)。

2.18 c语言中的位级运算

这里比较有意思的是我们可以利用异或 a^b^a = b 这一性质来完成两个变量的交换而不借用第三个变量。

x = x ^ y;

y = x ^ y;

x = x ^ y;

唯一的缺点是如果xy相等的话最终两个值都会变成0, 其实用加法也可以实现一样的效果并且避免这一缺陷。

x = x + y;

y = x – y;

x = x – y;

另外一个是2.13题中, 这道题首先应该把bis和 | 等价起来, 然后再把bic 和 x & (~y)等价起来, 之后我想的是如果要得到^直接 可以用 bic((0x11111111), bis(x, y)这个解决思路是有缺陷的, 就是只能在int为32位的机器上有效果, 其实更好的是 通过公式 x ^ y = (x & ~y ) | (~x & y) 得出 bis(bic(x, y ), bic(y, x))。

2.19 c语言中的逻辑运算

逻辑运算与位级运算的区别在于逻辑运算将所有非0的参数是为true, 其他视为false。 在c语言中操作符有 && || 和 !, 同时逻辑运算的短路遵循短路原则。 如 3 || 3 / 0,那么后面的3 / 0 是不会发生的。

如果只能用逻辑运算和位级运算等价表示x == y 的话, 可以这样写 !(x ^ y);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: