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)
还没有任何评论哟~
