关于无符号型的提问,希望大家看看!大家好!看代码C/C++ code#includestdio.h#includestring.hint main(
关于无符号型的提问,希望大家看看!
大家好!看代码
C/C++ code#include<stdio.h>#include<string.h>int main(void){ char a[]="hello"; char b[]="ab"; if(strlen(a)-strlen(b)>0) printf("good\n"); else printf("bad\n");}
我把if(strlen(a)-strlen(b)>0)这一句改成if(strlen(b)-strlen(a)>0)结果都是good。
我看《c和指针》里面说strlen返回的是无符号型,无符号型的数值大于0,但是我觉得不管怎么样,两个相减,总有一个小于0吧,怎么都是good啊!
还有,当我又定义int i;i=strlen(a),i的值为5,是不是此时无符号型自动转化成基本型,即int。
实际上还是对无符号型不太了解,知道百度上可以找,希望看看大家的想法。
谢谢各位了
[解决办法]无符号32位整型0 - 1 = 4294967295,整数溢出
[解决办法]通长度的整数类型可以互相转换,strlen返回的是size_t,32位环境下是32位的无符号整数所以可以隐式转换为int,64位环境下size_t是64位无符号整数,你这么写就该出警告了
[解决办法]strlen(b)-strlen(a)难道不是始终大于0么?
一个unsigned int减去unsigned int结果是unsigned int,应该是大于等于0的呀。
[解决办法]建议你看一下<深入理解计算机系统>第二章"信息的表示与处理",详细的结合c语言说清楚了整数运算的注意事项
[解决办法][解决办法]当你定义int i;i=strlen(a),a的值若为5,此时无符号数会转换为有符号数,底层的位不变,只是变成了补码解释位的方式,这样i的值也是5
[解决办法]unsigned int >= 0
[解决办法]4楼可以的
[解决办法]unsigned int >= 0,即使小于0也是大于0的,因为溢出了
[解决办法]你不懂溢出,不懂C,不懂数的范围,不懂补码,不懂原码,不懂反码
[解决办法]这里牵涉到符号的自动转换了,当有符号和无符号一起计算的时候,有符号也被转为无符号的,这里是两个无符号的数字计算,结果也被转化为无符号数了,负数转化为无符号的时候是一个很大的整数的,所以结果前后都是一样的
[解决办法]unsigned int 类型都是大于0的,两个无符号类型相减还是大于0
[解决办法] if((int)strlen(a)-(int)strlen(b)>0) printf("good\n");