欢迎来到天天文库
浏览记录
ID:52635140
大小:237.06 KB
页数:9页
时间:2020-01-31
《C语言中的无符号数和有符号数.pptx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、C语言中的无符号数和有符号数C语言中无符号数与有符号数比较对比较结果进行分析边界数值比较对比较程序进行测试测试结果C语言中无符号数与有符号数比较无符号数和有符号数是不能进行比较运算的,否则可能会出现意想不到的错误,且极难检查出来!首先肯几个例子(假设在32位的机器上):1 1.0==0U2 2.-1<0U(注:0是无符号的)3 3.2147483647U>-2147483647-14 4.2147483647>(int)2147483648U比较结果1 1.12 2
2、.0*3 3.0*4 4.1*从结果中可以看出,234都不是我们想像中的结果。在C语言中,当一个无符号数和一个有符号数进行比较运算时,有符号数会被隐含的转换成无符号数,并假设这两个数都是非负数,然后进行比较运算。当把一个有符号数转换成无符号数时,其底层的二进制表示没有改变,仅仅是对其进行了不同的解释。这样,由于这两个原因就会出现上面的结果。对比较结果进行分析首先分析一下2:-1的二进制补码表示是32个1。而0U的二进制补码表示是32个0.在比较的时候,-1被当做无符号数,也就是把32个1当做无符号数和32个0的无符号数比
3、较,显然,32个1要大于32个0.所以,2的结果是1.再看看3,-2147483647的二进制补码表示是10000000000000000000000000000000,-1的补码表示是32个1,两个相加,也就是补码异或,得到01111111111111111111111111111111,这个结果是溢出的。由于前一个的操作数是无符号数,因此,前面的计算结果被当做无符号数来处理,因此,这两个数是相等的。所以结果是0.对于4,2147483648U被转换成有符号数是-1,所以4的结果是1.边界数值比较从上面可以看出,无符号数和有符号数在进行比较的时候
4、,如果数值在边界上,则很容易出错。看下面的一段程序:1floatsum(floata[],unsignedintlen)2{3 inti;4 floatr=0.0;5 for(i=0;i<=len-1;++i)6 {7 r+=a[i];8 }9 returnr;10}如果len为0,那么这段代码将不会返回0.0。而是段错误。另外,当在无符号数和有符号数之间进行类型转换时,不同的转换顺序会得到不同的结果。如:12unsignedx=0xFFFF;3(int)((word<<24)>>24);4((in
5、t)word<<24)>>24;第一个表达式的结果是0xFF,而第二个是0xFFFFFFFF.原因是第一个表达式的右移运算高位补0,而第二个右移运算高位补1.对比较程序进行测试测试代码:1#include2#include3floatsum(floata[],unsignedintlen)4{5 inti;6 floatr=0.0;7 for(i=0;i<=len-1;++i)8 {9 r+=a[i];10 }1112 returnr;13}15intmain(
6、)16{17 printf("-1<0U:%s",(-1<0U)?"true":"false");18 printf("2147483647U>-2147483647-1:%s",(2147483647U>-2147483647-1)?"true":"false");19 printf("2147483647>(int)2147483648U:%s",(2147483647>(int)2147483648U)?"true":"false");2021 unsignedw=0xFFFF;22 printf("
7、(int)((w<<24)>>24)=%x",(int)((w<<24)>>24));23 printf("((int)(w<<24))>>24=%x",((int)(w<<24))>>24);2425 floata[1];26 printf("sum%f",sum(a,0));27 return0;28}运行结果1hcy@hcy-desktop:~$./a.out2-1<0U:false32147483647U>-2147483647-1:false42147483647>(int)2147483648U:tr
8、ue5(int)((w<<24)>>24)=ff6((int)(w<<24))>>24=ffffffff7段错误
此文档下载收益归作者所有