Git Product home page Git Product logo

csapp's Introduction

#第2章 信息的表示和处理 ##1. C语言中移位运算
左移仅仅在低位补0,右移分为算术位移和逻辑位移两种。算术右移时会在高位补1,如[01100100]算术右移4位为[11110100];逻辑右移则补0,如[01100100]逻辑右移4位为[00000100]。
但在Java中,用>>表示算术右移,用>>>表示逻辑右移。
注意:C语言中,对于一个w位的数,如果移动k位(k>=w),在很多机器上则只考虑位移量的低log2w位,即k mod w位。但在Java中,已经明确要求按照取模的方式进行移位。 ##2. C语言的强制类型转换

  • C语言的强制类型转换并不会改变底层的位模式。例如,考虑如下代码:
short int v = -12345;
unsigned short uv = (unsigned short) v;
printf("v = %d, uv = %u\n", v, uv);

在一台采用补码的机器上会输出:

v = -12345, uv = 53191

这是因为,类型为short的有符号数-12345在机器中用二进制补码表示为[1100 1111 1100 0111]2, 在将其转换为无符号数uv时,直接把最高位的符号位当成了数值位来计算,即 215+214+2<sup11+210+29+ 28+27+26+22+21+20=53191。

  • 在将范围小的数转换成范围大的数时,先进行位的扩展,再进行转换。如:
short x = -12345;
unsigned y = sx;
printf("y = %u:\t", y);

结果输出:

uy = 4294954951:

其中,4294954951用16进制表示为0XFFFFCFC7,即先进行位扩展,在高位补1后再进行转换。也即(unsigned)x等价于 (unsigned)(int)x
##3. 关于有符号和无符号的建议
实际编程中建议用有符号数表示,即使这个数不可能为负数。如以下代码:

float sum_elements(float a[], unsigned length) {
    int i;
    float result = 0;
    for (i = 0; i <= length-1; i++)
        result += a[i];
    return result;
}

注意到这里的lengthunsigned类型变量,如果实际使用时该参数为负数,则会把参数进行强制转换成 一个很大的无符号数(正数),导致数组越界问题。
##4. 整数加法

  • 无符号数运算
    假设无符号数为w位。两个无符号数x和y相加,如果其和超过2w-1,则即使w位全都为1也 无法表示这个数,此时就会溢出。由于x和y都是w位的,因此其结果最多为w+1位(假设w=4,则1111+1111=11110)。 如果溢出最高位会被截断,因此最终的结果为x+y-2w。 **补充:**个人对减法的实验
    无符号减法,经过实验,会先把无符号数强制转换成符号数(当做有符号数),进行减法运算后,再强制转换成无符号数。
  • 补码加法
    补码运算的巧妙之处在于,利用补码可以将减法转换成加一个负数。一个w位的负数,其补码的含义为:最高位 表示-2w-1,其余各位分别表示2i (0<=i<=w-1),各位表示的数之和就是这个负数的值。
    因此,补码运算可以分为三类:
    非负数和非负数相加
    非负数的补码的最高位为0,因此如果非负数之和超过了2w,最高位则为1,从补码的含义来看, 他们的和为负数,称为负溢出。
    负数和负数相加
    负数补码最高位为1,两个负数相加,不考虑进位,则最高位为0。因此,最高位的其余位之和必须大于 等于2w-1,才能保证最高位为1,否则最高位不是1,发生正溢出。即最终结果必须小于-2x2w-1+2w-1= -2w-1才不会溢出。
    非负数和负数相加
    这种情况不会产生溢出,非负数的范围是[0, 2w-1-1], 负数的范围是[-2w, 0),二者之和的范围是[-2w, 2w-1-1),均可用w位补码来表示。 因此不会发生溢出。
  • 个人体会
    查阅相关资料,发现计算机在进行减法运算时,先让减数经过一个反向器并加1,也就是取反,然后再送入ALU相加。因此如果减数是非负数,按位取反加1得到的就是对应负数的补码;如果减数是负数,按位取反加1得到的是对应正数的补码(正数的原码,反码和补码都相同)。而巧妙之处在于,一个数的相反数的补码正好是其补码按位取反加1。

csapp's People

Contributors

mickey-guo avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.