专栏首页HeaiKunCSAPP之信息(上)

CSAPP之信息(上)

许多操作系统使用8位的块作为最小可寻址内存单元,我们把内存看做一个很大的数组,最小可寻址单元的大小就是一个数组成员的大小。

进制数转换

在机器的世界里,都是由一个一个位组成的,也就是bit,每一个位由两种状态(0/1),也就是说计算机的世界里所有的信息都是二进制的,我们现实中所有的信息都是可以转换成二进制来表示的。 由于我们系统是按照8位作为一个单元的,一个单元就可以用两个十六进制数来表示,这样更加方便进行保存信息。 常见的进制转换有: 二进制与十六进制之间的转换:

四位二进制-->一位十六进制
一位十六进制-->四位二进制

二进制与八进制之间的转换:

三位二进制-->一位八进制
一位八进制-->三位二进制

当然这其中的进制之间的转换过程都离不开我们十进制的参与,八进制中0~7对应的就是十进制的0~7,十六进制的0~f就是对应着十进制的0~15。其他进制数与十进制数的转换其实也是很简单的。 类比十进制的:

12345=1*10^4+2*10^3+3*10^2+4*10^1+5*10^0

x进制数12345有

12345=1*x^4+2*x^3+3*x^2+4*x^1+5*x^0

反过来十进制转换其他进制用十进制数除以进制基数不停的取余数,先得到的余数是低位后得到的余数是高位的规则进行将余数排列,即得到了其他进制数。

字数据大小

每个机器都有一个字长,用来指明指针数据的标称大小。简单的说,就是内存这个大数组的数组下标的最大值。虚拟地址就是按照这个来进行设定空间的最大大小的,虚拟地址的范围是0~2^w-1。 目前主流的是32位字长机器和64位字长机器。大多数64位机器可以运行32位机器编译的程序。 编译方式:

linux> gcc -m32 prog.c

这样的程序可以在32位或64位机器上运行。如使用下指令编译:

linxu> gcc -m64 prog.c

这样的程序只能在64位机器上运行。 对于数据类型,就会受机器字长的影响,如下表:

有符号

无符号

32

64

(signed) char

unsigned char

1

1

short

unsigned short

2

2

int

unsigned int

4

4

long

unsigned long

4

8

int32_t

uint32_t

4

4

int64_t

uint64_t

8

8

char *

4

8

float

4

4

double

8

8

数据保存

数据在磁盘上保存的时候是有大小端区别的,什么是大小端呢? 我们都知道最小寻址单元是一个字节,如果我是两个字节的数据0x1234,那么在磁盘上或者内存上怎么存?是|12|34| 还是|34|12|?这两种方式就是大小端模式。简单来说就是低位数据放在小地址的存储方式是小端存储,高位数据放在小地址的存储方式是大端存储。如果地址从左到右递增,对应上面的例子就是|12|34|是大端存储,|34|12|是小端存储。 如何判断系统是大端还是小段呢?我们可以写一个简单的程序来进行判断:

#include <stdio.h>

int main()
{
    union {
        int i,
        char c
    } u;
    u.i = 1;
    if(u.i == u.c)
        printf("小端模式");
    else
        printf("大端模式");
    return 0;
}

union 数据有共同的起始地址,起始地址是最小的地址

布尔代数

二进制值是计算机编码、存储、和操作信息的核心,围绕数值0和1的研究已经演化出丰富的数学知识体系。这个研究是 乔治 · 布尔 的主要工作,因此称为布尔代数 。 布尔代数将0和1分别对应false和true。布尔运算主要有与、或、非、异或对应的符号分别是 "& | ~ ^" 具体的运算方式如下: :两个布尔数全为真时结果为真,否则为假。 :两个布尔数全为假时结果为假,否则为真。 :一个布尔数为假时结果为真,为真时结果为假。 异或:两个布尔数相同时为假,不同时为真。 位向量的运算就是将两个向量的对应位进行上面的四种运算,也就是我们所说的按位运算。

C语言中的位运算

C语言中的位运算需要两个数据类型一样的无符号整数进行操作,就是将两个数值对应位进行布尔运算,得到一个相同类型的数据。

C语言中的逻辑运算

逻辑运算的结果是布尔值,将两个数据先按规则转换成布尔值,然后进行布尔运算。这个规则是0值为false,其他值为true。

C语言中的移位运算

移位运算就是将数据的整体向左或右移动几个位。向左移k位,就是将最左边k位丢弃,最右补k个0,向右移k位就是将最右边k位丢弃,最左补k个0。 左移对应的数学运算是乘与2,移几位就是乘几个2,右移是除以2,移动几位就除以几个2,对应数学公式如下:

x<<k = x*(2^k)  

x>>k = x/(2^k)

未完待续。。。

本文分享自微信公众号 - HeaiKun(hhk-develop),作者:hehk

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++ Primer ---函数(读书笔记)

    一个函数是由 返回类型 函数名称 0个或多个形参以及函数体构成。 函数调用时 使用函数名称加小括号,小括号里面是实参。 函数调用时,完成部分的工作:

    HeaiKun
  • CSAPP第三章(3)

    前面讲了汇编的基本语法,后面主要讲的就是 相对于C语言这样的高级语言中的一些语法结构进行汇编级别的解析。当然对于再复杂的C语言结构语法,最终都是那些简单的汇编语...

    HeaiKun
  • 是先学会游泳还是先下水?

    看到这句话,大家是不是都是反对这个观点的?对的,这个观点是错误的,但是这个错误的观点,在我们生活中却时时上演着。

    HeaiKun
  • 彻底理清重载函数匹配

    前面我们讲到了《什么是函数重载?》,有了函数重载之后,就需要确定某次调用需要选用哪个函数。这个过程可以称之为函数匹配或者重载确定。大多数情况下,我们都很容易能够...

    编程珠玑
  • 安装centos之后要做的事

    本文由腾讯云+社区自动同步,原文地址 http://blogtest.stackoverflow.club/after-install-centos/

    羽翰尘
  • 人工智能是人性的罗夏测试

    在20世纪60年代,一位心理学家盯着他的病人——一个谢顶的中年领班,他的手里拿着一支香烟,一缕香烟环绕就像是虚幻的光环。心理学家举起一张墨迹图,一个用黑色的墨水...

    AI科技大本营
  • 人工智能是人性的罗夏测试

    用户1737318
  • Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) B. Bash's Big Day (Hash+简单数论)

    Bash has set out on a journey to become the greatest Pokemon master. To get his ...

    glm233
  • 深思考杨志明: 人工智能在路上,奇点还在科幻中

    GAIR 今年夏天,雷锋网将在深圳举办一场盛况空前的“全球人工智能与机器人创新大会”(简称GAIR)。大会现场,雷锋网将发布“人工智能&机器人Top25创新企...

    AI科技评论
  • 李彦宏:AI模仿人脑是走不通的

    人工智能(Artificial Intelligence)并不是一个新的概念,它实际上诞生于 20 世纪 50 年代。作为一门前沿交叉学科,人工智能一直没有统一...

    AI科技大本营

扫码关注云+社区

领取腾讯云代金券