以下是引用纯蓝之刃在2020-3-20 15:20:33的发言:
你在4楼只是给出了无符号数的溢出现象而没有给出有符号数的溢出现象。
相反我认为你在4楼所得到的结论正好是无符号数的优点,而应该避免使用有符号数。
因为无符号数回转之后还是一个正整数,并且这个正整数是可以预知的值,顶多会造成死循环,反而我们可以在得到溢出值后对该值进行准确的计算并判断该值是否溢出。
而有符号数回转之后返回的是一个不确定的值,我们无从判断该值是溢出后的值还是正常计算得到的值,反而无法对溢出现象进行判断更谈不上对该现象的纠正。
这样就会得到malloc((-n)*sizeof(char*);a[-n];等造成内存非法访问等比程序跑飞更加极度危险的情况。
所以按照你在4楼的论据得到的结论应该是“在数据类型允许的情况下,应该尽量使用无符号数字。”
同时在我3楼的帖子中给出的无符号数据在按位操作时更具有优越性。
你在4楼只是给出了无符号数的溢出现象而没有给出有符号数的溢出现象。
相反我认为你在4楼所得到的结论正好是无符号数的优点,而应该避免使用有符号数。
因为无符号数回转之后还是一个正整数,并且这个正整数是可以预知的值,顶多会造成死循环,反而我们可以在得到溢出值后对该值进行准确的计算并判断该值是否溢出。
而有符号数回转之后返回的是一个不确定的值,我们无从判断该值是溢出后的值还是正常计算得到的值,反而无法对溢出现象进行判断更谈不上对该现象的纠正。
这样就会得到malloc((-n)*sizeof(char*);a[-n];等造成内存非法访问等比程序跑飞更加极度危险的情况。
所以按照你在4楼的论据得到的结论应该是“在数据类型允许的情况下,应该尽量使用无符号数字。”
同时在我3楼的帖子中给出的无符号数据在按位操作时更具有优越性。
以下是提问者的问题
以下是引用下凡小仙男在2020-3-18 18:11:50的发言:
#include<stdio.h>
int main(void)
{
unsigned int a;
while (a>0)
a++;
printf("unsign_int max %u\n",a-1);
return 0;
}
输出的结果是正确答案
下面的代码却是一直在变化最大值一直递增不停又或者是什么都没有
#include<stdio.h>
int main(void)
{
unsigned int a=1;
while (a>0)
a++;
printf("unsigned_int max=%u\n",a-1);
return 0;
}
#include<stdio.h>
int main(void)
{
unsigned int a;
while (a>0)
a++;
printf("unsign_int max %u\n",a-1);
return 0;
}
输出的结果是正确答案
下面的代码却是一直在变化最大值一直递增不停又或者是什么都没有
#include<stdio.h>
int main(void)
{
unsigned int a=1;
while (a>0)
a++;
printf("unsigned_int max=%u\n",a-1);
return 0;
}
回答一,关于有符号类型数字溢出我已经在11楼回答了,有符号是回绕现象和无符号的益出不是一个现象
回答二,1.对的,无符号数有很多优点,就比如r版主说在效率上无符号要比有符号类型效率要高,2对于我说的避免使用无符号数这是我体现的主题,因为这是无符号类型的陷阱
,从我引用提问者的问题贴,可以看出这位初学者是掉入了unsigned类型无符号数字的陷阱中了,第一不用说是未初始化直接使用了,第二个正式我要说的陷阱,因为a会不停的加1,直到加到无符号类型的最大值,然后回绕成0,然后0-1变成一个负数,在无符号的陷阱中如果变成负号那就会成为一个很大的数,然后a变成0跳出循环,然后我就有了4楼的回帖,
回答三,是的,有符号如果益出将会出现不确定值,但是无符号没有溢出只会出现回绕,也就是它的余数会被保存下来,,而提问者出现的问题正是四楼我回答的答案,而且两个方面都包含了。一个是无符号数的溢出,另一个是无符号成为负数的种种情况
回答四 从你自己推论出内存访问之后的话我就不明白了
我一直说的是避免使用无符号数字,而不是使用无符号数字
至于优越性的问题,提问者也没提问优越性的问题,只提问为什么结果不一样,和为什么避免使用无符号数字
把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。