| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4478 人关注过本帖
标题:此帖为质疑讨论帖,知识碰撞帖,指导贴,由我回答某人问题被质疑开展开的
只看楼主 加入收藏
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:0 
如果对有符号类型和无符号数字类型的数字益出还不明白那我举个例子
程序代码:
#include<iostream>
int main()
{

     short ch = 32768;
    unsigned short ch1=65536;
     int ch2=2147483648;
     unsigned int ch_2=4294967296;
   std::cout<<"32位short有符号益出"<<ch<<'\n';
   std::cout<<"32位short无符号益出"<<ch1<<'\n';
    std::cout<<"32位int有符号益出"<<ch2<<'\n';
    std::cout<<"32位int无符号益出"<<ch_2<<'\n';
}

32位short有符号益出-32768
32位short无符号益出0
32位int有符号益出-2147483648
32位int无符号益出0

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-03-20 14:26
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
回复 11楼 叶纤
你看不懂我在说什么 不是我看不懂你在说什么
我知道溢出
我是说溢出不能作为避免使用无符号类型的理由

https://zh.
2020-03-20 14:28
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
回复 11楼 叶纤
有符号类型 无符号类型 都会溢出
为什么无符号就要避免 而有符号就不用
这才是我的提问
你闹半天都没搞清楚重点吗?

https://zh.
2020-03-20 14:29
return_0
Rank: 8Rank: 8
来 自:五维空间
等 级:禁止访问
威 望:3
帖 子:512
专家分:838
注 册:2020-1-28
收藏
得分:0 
这个帖子好吵呀
收到的鲜花
  • 叶纤2020-03-20 22:05 送鲜花  3朵   附言:快没分了少两朵,打扰了

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


这一层的内容可以这样解读
如果会出现溢出现象 应该使用更大类型
如果不使用更大类型 也应该考虑使用无符号类型 而不使用有符号类型
因为 有符号类型溢出是未定义行为 无符号类型溢出保证是回绕

这同样不是一个 避免使用无符号类型的理由

你所引用且翻译的是有符号的教学内容,并没有学到无符号的知识点,而且老师教的是当数字益出了,底层是怎么运作的,我所表达的也是和数字益出有关

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-03-20 14:35
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:0 
以下是引用lin5161678在2020-3-20 14:29:27的发言:

有符号类型 无符号类型 都会溢出
为什么无符号就要避免 而有符号就不用
这才是我的提问
你闹半天都没搞清楚重点吗?

大佬可能还没明白我所表达的内容,我从头到尾就没说避免使用无符号的类型
无符号类型有它的优点,但是无符号类型也存在陷阱,所以并不是让你完全禁止使用,而是除非在特殊情况下或不可避免,否则请避免使用无符号数字。

我说的是无符号的数字

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-03-20 14:41
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
是不是教学内容和这里的讨论无关
这里讨论的是 避免使用无符号类型的理由是什么
你目前的所有回复有不能讲清楚这个理由

https://zh.
2020-03-20 14:42
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:0 
无符号类型有它的优点,但是无符号类型也存在陷阱,所以并不是让你完全禁止使用,而是除非在特殊情况下或不可避免,否则请避免使用无符号数字。
1 那么使用无符号数字在哪里合理呢?
   
首先,在进行位操作时,首选无符号数字
其次,在某些情况下仍然不可避免地要使用无符号数,主要是那些与数组索引有关的数字。
另请注意,如果您是为嵌入式系统(例如Arduino)或其他处理器/内存受限的环境而开发的,出于性能方面的考虑,无符号数的使用更为常见并被接受(在某些情况下是不可避免的)。
2 为什么说避免使用
    当不需要负数时,无符号整数非常适合于网络和内存很少的系统,因为无符号整数可以存储更多的正数而不会占用额外的内存。
无符号整数不会溢出。 取而代之的是,如果值超出范围,则将其除以该类型的最大数除以一,然后仅保留其余部分。也就是回绕
举个例子     数字280太大,无法容纳0到255的1字节范围。大于类型的最大数字的1是256。因此,我们将280除以256,得到1个余数24。24的余数 被储存了。
程序代码:
        #include <iostream>
     
    int main()
    {
        unsigned short x{ 65535 }; // largest 16-bit unsigned value 2*8。 16possible
        std::cout << "x was: " << x << '\n';
     
        x = 65536; // 65536 is out of our range, so we get wrap-around65536超出了我们的范围,因此我们得到了环绕
        std::cout << "x is now: " << x << '\n';0
     
        x = 65537; // 65537 is out of our range, so we get wrap-around65537超出了我们的范围,因此我们得到了环绕。    1
        std::cout << "x is now: " << x << '\n';
     
        return 0;
    }

程序代码:
    避免使用无符号
    #include <iostream>
     
    int main()
    {
    unsigned int x{ 3 };
    unsigned int y{ 5 };
     
    std::cout << x - y << '\n';
    return 0;
    }



    发生这种情况的原因是-2环绕到一个数字,该数字接近4字节整数范围的顶部。 当使用-运算符反复减小无符号整数时,通常会发生不必要的回绕。 引入循环后,您将看到一个示例。
      第二,混合有符号和无符号整数时,可能会导致意外行为。 在上面的示例中,即使其中一个操作数(x或y)是有符号的,另一个操作数(无符号的一个)也将导致有符号的一个被提升为无符号的整数,并且将产生相同的行为!
     除非在特殊情况下或不可避免,否则请避免使用无符号数字。
当然以上内容是我的学习笔记,有很多地方都不明白,如果对
无符号是陷阱还有疑问的话,请参阅http://soundsoftware.ac.uk/c-pitfall-unsigned.html
争论内容在这

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-03-20 14:42
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
收藏
得分:0 
以下是引用lin5161678在2020-3-20 14:42:05的发言:

是不是教学内容和这里的讨论无关
这里讨论的是 避免使用无符号类型的理由是什么
你目前的所有回复有不能讲清楚这个理由

一,这个是我发出的主题帖,并不是你发的主题帖,而且发这则主题帖的原因是由4楼内容开展的,你只是对我的内容有质疑,我也是把我发帖子的思想展现给您
二,汉字部分已经很清楚了,我所讨论的不是避免无符号类型,而是以下内容
是无符号类型有它的优点,但是无符号类型也存在陷阱,所以并不是让你完全禁止使用,而是除非在特殊情况下或不可避免,否则请避免使用无符号数字。


把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-03-20 14:56
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:570
专家分:3727
注 册:2019-7-29
收藏
得分:0 
你在4楼只是给出了无符号数的溢出现象而没有给出有符号数的溢出现象。
相反我认为你在4楼所得到的结论正好是无符号数的优点,而应该避免使用有符号数。
因为无符号数回转之后还是一个正整数,并且这个正整数是可以预知的值,顶多会造成死循环,反而我们可以在得到溢出值后对该值进行准确的计算并判断该值是否溢出。
而有符号数回转之后返回的是一个不确定的值,我们无从判断该值是溢出后的值还是正常计算得到的值,反而无法对溢出现象进行判断更谈不上对该现象的纠正。
这样就会得到malloc((-n)*sizeof(char*);a[-n];等造成内存非法访问等比程序跑飞更加极度危险的情况。
所以按照你在4楼的论据得到的结论应该是“在数据类型允许的情况下,应该尽量使用无符号数字。”
同时在我3楼的帖子中给出的无符号数据在按位操作时更具有优越性。
收到的鲜花
  • lin51616782020-03-20 15:30 送鲜花  10朵  
  • 叶纤2020-03-20 21:21 送鲜花  5朵   附言:感谢提出新知识

一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2020-03-20 15:20
快速回复:此帖为质疑讨论帖,知识碰撞帖,指导贴,由我回答某人问题被质疑开展开 ...
数据加载中...
 
   



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

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