2.1 信息存储

一、十六进制表示法
1、C语言以0x或0X表示十六进制,字符A到F即可以大写也可以小写,混写也可以。
2、常见的任务是在二进制、十进制、十六进制间切换表示法。十进制转其他进制的方法是不断的把取模数作为低阶位,不断的求商作为下次被除数。其他进制转十进制是用每一位的数乘以此位的指数基数。二进制与十六进制通过一个4位的映射表互转。

二、数据大小
1、字长决定了虚拟地址空间的大小,目前有32位和64位两种。
2、gcc -m32 prog.c在32位和64位机器上都可以运行;gcc -m64 prog.c只能在64位机器上运行。
3、char类型由于被用来存储文本串中的单个字符而得名,但它也能被用来存储整数值。
4、C语言的几种数据类型会因为机器字长不同而有不同的大小,所以ISO99引入了int32_t和int64_t这两种不依赖编译器和机器字长、固定大小的数据类型。
5、关键字顺序,C语言并不严格要求,unsigned long和long unsigned都是可以的。

三、寻址和字节顺序
1、对于任意一个程序对象,我们需要知道这个对象的内存地址以及内存中如何排列这个对象占用的字节。对象地址为所使用字节中最小的地址,字节排列一般是连续排列。
2、排列有两个通用规则,little endian和big endian(和人的表达方式一致,高位在最左)。
3、字节顺序对于程序开发者是不可见的。但是以下三种情况字节序很重要:
网络间传递数据
阅读汇编程序的整数数据表示时
编写规避正常的类型系统的程序时
4、C语言中typedef可重新命名一个类型,比如命名一个指针类型
typedef unsigned char *byte_pointer,sizeof可以确定一个对象的字节数,printf中%x打印出十六进制表示法。

四、字符串表示
1、C语言中字符串被编码为以一个null(0x00)结尾的字符数组,每个字符都由某个标准编码来表示,最常见的是ASCII编码。
2、在使用ASCII作为字符码的任何系统上,字符串的表示与字节顺序和字长大小都无关。比如“12345”在任意以ASCII编码的系统上都表示为0x313233343500。

五、代码表示
1、程序编码为机器的二进制码时,不同的机器和操作系统下的编码结果是不一样的。因此同一个程序在不同系统的二进制编码是不兼容的。

六、布尔代数简介
1、a & (b | c) = (a & b) | (a & c); a | (b & c) = (a | b) & (a | c);
2、a ^ a = 0; a ^ b ^ a = b;
3、位向量用来表示结合,例如a = [01101001]表示集合A = {0, 3, 5, 6},a向量从最右边表示0开始,1表示值在集合中。a & b表示交集,a | b表示并集。

七、C语言中的位级运算
1、C语言中的位运算符号&、|、~、^可以运用到任何整型的数据类型上。
2、十六进制或者十进制表示的数先转为二进制进行位运算,结果再转回相应进制。
3、掩码,是一个位模式,表示从一个字中选出的位的集合。例如,掩码0xFF表示一个字的低8位字节,x&0xFF将得到一个由x的低8位组成的值。表达式~0将得到一个全1的掩码,不管机器的字长大小是多少。

八、C语言中的逻辑运算
1、&&;||;!
2、如果对第一个参数求值就能确定表达式的结果,就不会对第二个参数求值

九、C语言中的位移运算
1、左移x< 2、右移x>>k,逻辑右移补k个0,算术右移补k个最高位有效的值。几乎所有的编译器和机器对有符号数都采取算术右移,对无符号数采取逻辑右移。
3、Java中,x>>k表示算术右移k个位置,x>>>k表示逻辑右移k个位置。
4、当位移k位超过字长时,C语言不保证运算结果,所以需要自己保证k不超过字长;而Java采用k%字长得到最后位移的位数。

你可能感兴趣的:(2.1 信息存储)