Advertisement

CSAPP||有符号数和无符号数

阅读量:

有符号数和无符号数的转换

有符号数转换成无符号数

x= \begin{cases} x + 2^w & \text{x=0} \end{cases}

无符号数转补码

x=\begin{cases} x & \text{xTmax}\end{cases}

无符号和补码的关系

1 + UMax = 2^w

有符号数和无符号数的运算

当执行一个运算是,如果一个运算数是有符号的另一个是无符号的,c隐式地将无符号数转换成有符号数

拓展一个数字的位表示

在不同字长的整数之间转换(小类型 -> 大类型)

无符号 -> 零拓展

在开头添加0

有符号 -> 符号拓展

在开头添加最高有效位的值

因为
2^w - 2^{w - 1} = 2^{w - 1}
所以运算的综合效果和原来一样 (csappP55 )

截断一个数字的位表示

无符号数

把α位的数字x截断为w位,其实是x mod 2^w

有符号数

把α位的数字x截断为w位,其实是无符号数–> 有符号数再mod,(T2U)x mod 2^w

建议

不要使用无符号数

不过当无符号数是位的集合而不表示数字的时候还是很好用的。

隐式转换的隐患(例子)

复制代码
    #include<stdio.h>
    
    float sun_elements(float a[], unsigned length) {
    int i;
    float result = 0;
    
    for(i = 0; i <= length - 1; i++) {
        result += a[i];
    }
    return result;
        
    }
    
    int main() {
    
    float arr[2] = {1.0, 2.0};
    int length = 0;
    printf("%f", sun_elements(arr, length));
    
    return 0;
    }

length是0的时候,出现错误

全部评论 (0)

还没有任何评论哟~