C语言中的无符号数和有符号数.pptx

C语言中的无符号数和有符号数.pptx

ID:52635140

大小:237.06 KB

页数:9页

时间:2020-01-31

C语言中的无符号数和有符号数.pptx_第1页
C语言中的无符号数和有符号数.pptx_第2页
C语言中的无符号数和有符号数.pptx_第3页
C语言中的无符号数和有符号数.pptx_第4页
C语言中的无符号数和有符号数.pptx_第5页
资源描述:

《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段错误

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。