《深入理解计算机系统》学习笔记(二)1.7~2.1

    科技2022-07-10  94

    《深入理解计算机系统》学习笔记(二) 1.7 C语言中的位级运算   C语言的一个很有用的特性就是它支持按位布尔运算。事实上,我们在布尔运算中使用的那些符号就是C语言所使用的: |就是OR(或),&就是AND(与),~就是NOT(取反),而^就是EXCLUSIVE-OR(异或)。    按位或运算(|):

    00110000 | 00001111 00111111

    由此可知48&15=63

    按位与运算(&):

    00000011 & 00000101 00000001

    由此可知3&5=1

    1.8 C语言中的逻辑运算     C语言还提供了一一 组逻辑运算符l、&.&. 和!,分别对应于命题逻辑中的OR、AND和NOT运算。逻辑运算很容易和位级运算相混淆,但是它们的功能是完全不同的。逻辑运算认为所有非零的参数都表示TRUE,而参数0表示FALSE。它们返回1或者0,分别表示结果为TRUE或者为FALSE。    1.9 C语言中的移位运算   C语言还提供了一组移位运算, 向左或者向右移动位模式。对于一个位表示为[x-1,x0 ]的操作数x,C表达式x<<k会生成-一个值,其位表示为[xw–1,2u–2,…,xo, 0,, …,0]。也就是说,x向左移动k位,丢弃最高的k位,并在右端补k个0。移位量应该是一个0~w-1之间的值。移位运算是从左至右可结合的,所以x<<j<<k等价于(x<<j)<<k。   有一个相应的右移运算x>>k,但是它的行为有点微妙。一般而言,机器支持两种形式的右移:逻辑右移和算术右移。逻辑右移在左端补k个0,得到的结果是[0,.,.0,工-1,xXw-2, … x]。算术右移是在左端补k个最高有效位的值,得到的结果是[xw,…xw-1, xw-1, xw-2, … xr]。 这种做法看上去可能有点奇特,但是我们会发现它对有符号整数数据的运算非常有用。   让我们来看一个例子,下面的表给出了对一个8位参数x的两个不同的值做不同的移位操作得到的结果:   斜体的数字表示的是最右端(左移)或最左端(右移)填充的值。可以看到除了一个条目之外,其他的都包含填充0。唯一的例外是算术右移[ 10010101]的情况。因为操作数的最高位是1,填充的值就是1。   C语言标准并没有明确定义对于有符号数应该使用哪种类型的右移一算术右移或 者逻辑右移都可以。不幸地,这就意味着任何假设一种或者另一 种右移形式的代码都可 能会遇到可移植性问题。然而,实际上,几乎所有的编译器/机器组合都对有符号数使用算术右移,且许多程序员也都会假设机器会使用这种右移。另一方面,对于无符号数,右移必须是逻辑的。   与C相比,Java对于如何进行右移有明确的定义。表达式会将x>>k算术右移k个位置。而x>>>k 会对x做逻辑右移。      移位运算有关的操作符优先级问题:   常常有人会写这样的表达式1<<2+3<<4,本意是(1<<2)+(3<<4)。但是在C语言中,前面的表达式等价于1<<(2+3)<<4,这是由于加法(和减法)的优先级比移位运算要高。然后,按照从左至右结合性规则,括号应该是这样打的(1<<(2+3))<<4, 得到的结果是512,而不是期望的52。   在C表达式中搞错优先级是一种常见的程序错误原因,而且常常很难检查出来。所以当 拿不准的时候,请加上括号!

    2.1 整型数据类型   C语言支持多种整型数据类型——表示有限范围的整数。如下分别为32位和64位机器的取值范围。  

       负数范围比整数的范围大1。    C和C++都支持有符号和无符号数。Java只支持有符号数。

    Processed: 0.009, SQL: 8