yinble

导航

 

转自:http://blog.163.com/kissinger_1984/blog/static/1689925201282265651412/

1. 无符号数就是普通的二进制表示,有符号数为补码表示,绝大多数的计算机都是用补码表示有符号数

2. 有符号数和无符号数之间互相转换的原则是:两种数字一起运算时,有符号数向无符号数转换,其二进制表示的位模式不会改变。有几个小问题要注意,
1)如果转换的无符号数过大,导致超出补码能够表示的范围,这个就需要琢磨下,转换后的数字到底是多少了。所以,如果无符号数比较小,转成有符号数时其数值可能不会变,而较大时候,则可能数值就变了。
2) 无符号数和有符号数之间的逻辑运算,比如>, <这样的运算,其结果就很不直观,容易犯错。举例,32位采用补码的机器,考虑比较式:-1 < 0U, 因为-1的位模式是0xFFFFFFFF,转换为无符号数是个很大的数字,所以,此表达式相当于 4294967295U < 0U,所以表达式为false.
3. 常量整数,默认是有符号的
4. 将一个较小类型的数据类型转为较大的类型时,如果是无符号数,我们只需要在开头简单的添加0, 称为零扩展。而将一个补码数字转为更大数据类型时候则需要做符号扩展,规则是在表示中,添加最高有效位的副本,即,如果最高有效位是0则添加0,是1则添加1
 
例题:
我的理解:0U - 1, 相当于 0U + (-1),一个有符号数,一个无符号数,有符号转为无符号,所以,结果是0xFFFFFFFF,是32位无符号数的最大值,i <= length -1 就相当于 i < 4294967295U, 是必然成立的,用这个i做索引去引用数组,很快就要超出数组的边界,引用到不该用的内存
posted on 2013-04-15 16:48  yinble  阅读(352)  评论(0编辑  收藏  举报