| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4479 人关注过本帖
标题:此帖为质疑讨论帖,知识碰撞帖,指导贴,由我回答某人问题被质疑开展开的
只看楼主 加入收藏
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:0 
以下是引用纯蓝之刃在2020-3-20 15:20:33的发言:

你在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;
 
}

回答一,关于有符号类型数字溢出我已经在11楼回答了,有符号是回绕现象和无符号的益出不是一个现象
回答二,1.对的,无符号数有很多优点,就比如r版主说在效率上无符号要比有符号类型效率要高,2对于我说的避免使用无符号数这是我体现的主题,因为这是无符号类型的陷阱
,从我引用提问者的问题贴,可以看出这位初学者是掉入了unsigned类型无符号数字的陷阱中了,第一不用说是未初始化直接使用了,第二个正式我要说的陷阱,因为a会不停的加1,直到加到无符号类型的最大值,然后回绕成0,然后0-1变成一个负数,在无符号的陷阱中如果变成负号那就会成为一个很大的数,然后a变成0跳出循环,然后我就有了4楼的回帖,
回答三,是的,有符号如果益出将会出现不确定值,但是无符号没有溢出只会出现回绕,也就是它的余数会被保存下来,,而提问者出现的问题正是四楼我回答的答案,而且两个方面都包含了。一个是无符号数的溢出,另一个是无符号成为负数的种种情况
回答四 从你自己推论出内存访问之后的话我就不明白了
我一直说的是避免使用无符号数字,而不是使用无符号数字
至于优越性的问题,提问者也没提问优越性的问题,只提问为什么结果不一样,和为什么避免使用无符号数字

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-03-20 16:29
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
回复 21楼 叶纤
回答一,关于有符号类型数字溢出我已经在11楼回答了,有符号是回绕现象和无符号的益出不是一个现象

11楼的代码
比无符号数最大值大1 结果是 无符号数最小值
比有符号数最大值大1 结果是 有符号数最小值
为什么你会认为不是同一个现象??

https://zh.
2020-03-20 16:44
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:0 
回复 22楼 lin5161678
感谢帖主的提问,提问的非常好,虽然思想我是从老师那理解出来的,但是作为小白的我能代替我学习网站的老师回答您的问题,我是上辈子积了八辈子的好运
如果您是指数字溢出问题
八楼已经回答您了,这也是论坛老师的思维
整数溢出

如果我们尝试将值280分配给1个字节的有符号整数会怎样?此数字超出1字节有符号整数可以容纳的范围。数字280需要表示9位(加上1个符号位),但是在1字节有符号整数中,我们只有7位(加上1个符号位)可用。

当我们尝试存储超出类型范围的值时,会发生整数溢出(通常简称为溢出)。本质上,我们要存储的数字表示的位数比对象可用的位数更多。在这种情况下,数据丢失是因为对象没有足够的内存来存储所有内容。

在有符号整数的情况下,丢失哪些位的定义不明确,因此有符号整数溢出会导致未定义的行为。

警告

有符号整数溢出将导致不确定的行为。
通常,溢出会导致信息丢失,这几乎是不希望的。如果有任何怀疑的对象可能需要存储落在其范围之外的值,使用类型有一个更大的范围内!

如果您想知道回绕与溢出的区别,老师也有回答

整数的内部表示形式是实现定义的。大多数编译器使用二进制补码(在有关二进制转换的课程中介绍)。

2.
您可能会用完内存。

3.
溢出:添加一个数字,执行加法运算,所有不适合该类型的二进制数字都将被删除。
环绕:添加一个数字,如果该数字不适合您的类型,则其余数将被存储。

有符号数溢出(我不知道是否定义明确),无符号数显式环绕。

无符号类型的可表示值范围是0到2 N -1
(含)。无符号类型的算术以2 N为模执行。[注意:无符号算术不会溢出。有符号算术的溢出产生未定义的行为



把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-03-20 17:38
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:0 
说了这么多避免使用,4楼也提到了无符号数字在哪里用比较好,蓝版主已经提到了一条位操作的时候
不过四楼还另说里几条,感兴趣的话可以看看
1 那么使用无符号数字在哪里合理呢?
   
首先,在进行位操作时,首选无符号数字
其次,在某些情况下仍然不可避免地要使用无符号数,主要是那些与数组索引有关的数字。
另请注意,如果您是为嵌入式系统(例如Arduino)或其他处理器/内存受限的环境而开发的,出于性能方面的考虑,无符号数的使用更为常见并被接受(在某些情况下是不可避免的)。

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-03-20 18:09
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
以下是引用叶纤在2020-3-20 17:38:55的发言:

感谢帖主的提问,提问的非常好,虽然思想我是从老师那理解出来的,但是作为小白的我能代替我学习网站的老师回答您的问题,我是上辈子积了八辈子的好运
如果您是指数字溢出问题
八楼已经回答您了,这也是论坛老师的思维
整数溢出

如果我们尝试将值280分配给1个字节的有符号整数会怎样?此数字超出1字节有符号整数可以容纳的范围。数字280需要表示9位(加上1个符号位),但是在1字节有符号整数中,我们只有7位(加上1个符号位)可用。

当我们尝试存储超出类型范围的值时,会发生整数溢出(通常简称为溢出)。本质上,我们要存储的数字表示的位数比对象可用的位数更多。在这种情况下,数据丢失是因为对象没有足够的内存来存储所有内容。

在有符号整数的情况下,丢失哪些位的定义不明确,因此有符号整数溢出会导致未定义的行为。

警告

有符号整数溢出将导致不确定的行为。
通常,溢出会导致信息丢失,这几乎是不希望的。如果有任何怀疑的对象可能需要存储落在其范围之外的值,使用类型有一个更大的范围内!

如果您想知道回绕与溢出的区别,老师也有回答

整数的内部表示形式是实现定义的。大多数编译器使用二进制补码(在有关二进制转换的课程中介绍)。

2.
您可能会用完内存。

3.
溢出:添加一个数字,执行加法运算,所有不适合该类型的二进制数字都将被删除。
环绕:添加一个数字,如果该数字不适合您的类型,则其余数将被存储。

有符号数溢出(我不知道是否定义明确),无符号数显式环绕。

无符号类型的可表示值范围是0到2 N -1
(含)。无符号类型的算术以2 N为模执行。[注意:无符号算术不会溢出。有符号算术的溢出产生未定义的行为

这段话可以清楚的看到你对这里的内容理解存在偏差

对于 整数溢出 这个情况
首选建议是选择更大类型
没有更大类型使用无符号
有符号类型不可取
所以我一直强调 整数溢出 无法作为避免无符号类型的理由

用完内存的说法是无稽之谈 和有符号/无符号毫无关系

计算结果超出取值范围就是溢出
环绕是溢出之后的现象
你对这两个词的意思的理解非常奇怪

然后不管是溢出还是环绕 都是在描述无符号类型的优点/有符号类型的缺点
而你却企图用无符号类型的有点证明要避免使用无符号类型
这是我想不通的
收到的鲜花
  • 叶纤2020-03-20 21:27 送鲜花  4朵   附言:感谢你的质疑

https://zh.
2020-03-20 18:32
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:0 
以下是引用lin5161678在2020-3-20 18:32:29的发言:


这段话可以清楚的看到你对这里的内容理解存在偏差

对于 整数溢出 这个情况
首选建议是选择更大类型
没有更大类型使用无符号
有符号类型不可取
所以我一直强调 整数溢出 无法作为避免无符号类型的理由

用完内存的说法是无稽之谈 和有符号/无符号毫无关系

计算结果超出取值范围就是溢出
环绕是溢出之后的现象
你对这两个词的意思的理解非常奇怪

然后不管是溢出还是环绕 都是在描述无符号类型的优点/有符号类型的缺点
而你却企图用无符号类型的有点证明要避免使用无符号类型
这是我想不通的

有符号类型数字和无符号类型数字,是我理解有问题吗

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-03-20 18:52
d7se123
Rank: 2
等 级:论坛游民
帖 子:65
专家分:14
注 册:2020-3-13
收藏
得分:0 
回复 14楼 return_0
我的求助帖子要是有这么多人就好了 吵我不怕啊
收到的鲜花
  • 叶纤2020-03-20 22:06 送鲜花  2朵   附言:一起加油,贵在求知
2020-03-20 19:50
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
你想你的帖子有这么多的跟帖,那你就得提出有分量的问题,或者有分量的心得。不然就没戏。
2020-03-20 19:56
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
咬文嚼字??
请讲一下 避免使用无符号整数 和 避免使用无符号类型有什么区别
这不是一回事?

https://zh.
2020-03-20 20:27
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
有符号就是最高位是符号位,其余的位是数据位。无符号就是所有位都是数据位。比如char类型是8位的,其中最高位是符号位1=00000001b,-1=11111111b(这里涉及到了补码),它能表示的范围是-128~+127。unsigned char 是无符号字符型也是8位,它没有符号位,最高位是数据位,比如1=00000001b,255=11111111b,它的范围是0~255。
收到的鲜花
  • 叶纤2020-03-20 21:19 送鲜花  5朵   附言:对,就是这个,弥补了我的不足
2020-03-20 20:44
快速回复:此帖为质疑讨论帖,知识碰撞帖,指导贴,由我回答某人问题被质疑开展开 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.102306 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved