zoukankan      html  css  js  c++  java
  • 信息的表示和处理(1)

    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 ", (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);

  • 相关阅读:
    Linux第七周学习总结——可执行程序的装载
    《深入理解计算机系统》第七章读书笔记
    《Linux内核设计与实现》第三章读书笔记
    《Linux内核设计与实现》第十八章读书笔记
    Linux第六周学习总结——进程额管理和进程的创建
    Linux第五周学习总结——扒开系统调用的三层皮(下
    《Linux内核设计与实现》第五章读书笔记
    #Linux第四周学习总结——扒开系统调用的三层皮(上)
    《Linux内核设计与实现》第一二章读书笔记
    Linux第三周学习总结——构造一个简单的Linux系统MenuOS
  • 原文地址:https://www.cnblogs.com/nzhl/p/5573874.html
Copyright © 2011-2022 走看看