表示字符串、
C 语言中字符串被编码为一个以 null (其值为 0)字符结尾的字符数组。每个字符都由某个标准编码来表示,最常见的是 ASCII 字符码。因此,如果我们以参数 “12345” 和 6 (包括终止符),来运行 show_bytes,我们得到结果 31 32 33 34 35 00。请注意,十进制 x 的 ASCII 码正好是 0x3x,而终止字节的十六机制表示为 0x00。在使用 ASCII 码作为字符码的任何系统上都将得到相同的结果,与字节顺序和字大小规则无关。因而,文本数据比二进制数据具有更强的平台独立性。
表示代码、
考虑下面的 C 函数:
int sum(int x, int y)
{
return x + y;
}
当我们在示例机器上编译时,生成如下字节表示的机器码:

我们发现指令编码是不同的。不同的机器类型使用不同的且不兼容的指令和编码方式。即使是完全一样的进程,运行在不同的操作系统上也会有不同的编码规则,因此二进制代码是不兼容的。二进制代码很少能在不同机器和操作系统组合之间移植。
计算机系统的一个基本概念就是,从机器的角度看,程序仅仅是字节序列。机器没有关于原始源程序的任何信息,除了可能有些帮助调试的辅助表以外。在第 3 章学习机器级编程时,我们将更清除的看到这一点。
布尔代数简介、
二进制值
是计算机编码
、存储
和 操作信息
的 核心
,所以围绕数值 0 和 1 的研究已经演化出了丰富的数学知识体系。这起源于 1850 年前后 乔治 · 布尔 (George Boole, 1815-1864)的工作,因此也称为 布尔代数(Boolean algebra)。布尔注意到 通过将逻辑值 TRUE (真)和 FALSE (假)编码为二进制 1 和 0,能够设计出一种代数,以研究逻辑推理的基本原则。

C 语言中的位级运算、
C语言的一个很有用的特性就是它支持按位布尔运算。事实上,我们在布尔运算中使用的那些符号就是C语言所使用的:|就是OR(或),&就是 AND(与),~就是NOT(取反),而^就是EXCLUSIVE-OR(异或)。这些运算能运用到任何“整型”的数据类型上,包括图2-3所示内容。以下是一些对char数据类型表达式求值的例子:

异或运算相同取0,不相同取1,如 0 0 , 1 1 取0,0 1 1 0 取1.
正如示例说明的那样,确定一个 位级表达式的结果
最好的方法,就是 将十六进制的参数扩展成二进制表示并执行二进制运算,然后再转换回十六进制
。
C 语言中的逻辑运算、
C语言还提供了一组逻辑运算符 ||、&&和!,分别对应于命题逻辑中的OR、AND和NOT运算。逻辑运算很容易和位级运算相混淆,但是它们的功能是完全不同的。逻辑运算认为所有非零的参数都表示TRUE,而参数0表示FALSE。它们返回1或者0,分别表示结果为TRUE或者为FALSE。
逻辑运算符&&和与它们对应的位级运算&和|之间第二个重要的区别是,如果对第一个参数求值就能确定表达式的结果,那么逻辑运算符就不会对第二个参数求值。因此,例如,表达式a&&85/a将不会造成被零除,而表达式p&&*p++也不会导致间接引用空指针。
C 语言中的移位运算、
移位运算:将二进制数值的各数位进行左右移位的运算。移位有左移和右移两种情况。符号分别为 << (左移)和 >> (右移)。移位运算有逻辑位移与算数位移两种:
注意:将移位区分为逻辑移位和算术移位的原因是,不希望移位运算影响数本来的正负性。
无论是神马类型的移位,记住一点,【左移乘法,右移除法】
逻辑位移:不涉及符号的变化,进行逻辑左移,逻辑右移时,移位后的数会相应的变大,缩小,空出来的低位或高位会由0填充。
例如: 将0000 0001左移两位 << 2,移位后变成0000 0100,该数由十进制数 1 扩大2的2次方倍变成了十进制数 4;相反的,0000 0100右移两位 >> 2,变成0000 0001,则缩小了四倍。在二进制中,左移一位,得数比原数大两倍,右移一位 ,得数比原数小两倍。和十进制类似。
算数位移:这里着重介绍算数右移。将二进制数作为带符号的数值进行运算时,移位后要在空出的所有高位填充移位前的符号位的值(0或1),就叫做算数右移。 如果最高位数值是用补数表示的负数值即为1,那么右移后在空出来的高位补1。如果是正数即为0,相应的补0即可。移位后数的大小变化同逻辑运算。对于有符号数,几乎所有的编译器右移都是算数右移,对于无符号数则是逻辑右移。
例如:1011 1111(-65)右移两位,由于该数是负数,所以在移位后,高位补1,即:1110 1111(-17)
整数表示、
在本节中,我们描述用位来编码整数的两种不同的方式:一种只能表示非负数,而另一种能够表示负数、零和正数。后面我们将会看到它们在数学属性和机器级实现方面密切相关。我们还会研究扩展或者收缩一个已编码整数以适应不同长度表示的效果。
图2-8列出了我们引人的数学术语,用于精确定义和描述计算机如何编码和操作整数。这些术语将在描述的过程中介绍,图在此处列出作为参考。

整数数据类型、
C语言支持多种整型数据类型——表示有限范围的整数。这些类型如图2-9和图2-10所示,其中还给出了“典型”32位和64位机器的取值范围。每种类型都能用关键字来指定大小,这些关键字包括char、short、long,同时还可以指示被表示的数字是非负数(声明为unsigned),或者可能是负数(默认)。如图2-3所示,为这些不同的大小分配的字节数根据程序编译为32位还是64位而有所不同。根据字节分配,不同的大小所能表示的值的范围是不同的。这里给出来的唯一一个与机器相关的取值范围是大小指示符long的。大多数64位机器使用8个字节的表示,比32位机器上使用的4个字节的表示的取值范围大很多。


Comments NOTHING