信息的表示与处理-小结

来源:互联网 发布:世界上首例网络攻击 编辑:程序博客网 时间:2024/06/06 03:35

1.C语言的移位运算:机器一般支持两种形式的右移,逻辑右移与算术右移,逻辑右移在左端补0,算术右移在左端补最高有效位的值。 如x[xn-1,xn-2,…x1,x0]。x>>k,右移k位得到x[0,0…,xn-1,…xk](逻辑右移) 和x[xn-1,…,xn-2,…xk](算术右移)。对于无符号数据,右移必须是逻辑的;对于有符号数据,右移可逻辑可算术,但机器/编译器一般使用算术右移。而JAVA中对右移有明确的定义,x>>k会对x做算术右移,x>>>k会对x做逻辑右移。

2.C语言在执行一个运算时,如果一个运算数时有符号的,另一个数时无符号的,那么将隐式的将有符号数转为无符号数。所以在进行比较运算时会导致非直观的结果,如-1<0U,会返回false。

3.从一个数据大小到另一个数据大小的转换,以及从无符号到有符号的转换的顺序会影响到一个程序的行为。例如C语言中,usigned(short sx)是先将sx转为int再转为unsigned。不同的顺序是会导致不同结果的。如-1从short到uint_32,前者会得到2^32-1,后者会得到2^16-1。
2002年写FreeBSD开源操作系统的程序员发现一个bug,这个bug就是由无符号与有符号数之间的转换引起的,参数的类型不一致。
JAVA中只使用有符号数。 但无符号数是非常有用的,比如自然地址就是无符号的。

4.补码中有个特殊的数,如int_32的范围是2^-31~(2^31-1)。这个数域不是对称的,2^-31这个数的加法逆元规定是其本身,因为2^-31+2^-31它的位表示得到的结果是0。这个情况不考虑的话,也会出现bug。

0 0
原创粉丝点击