标题:两个一样的代码输出的结果为何不同 求大佬指点迷津
只看楼主
下凡小仙男
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2020-3-16
得分:0 
回复 18楼 rjsp
就是两者之间为什么速度会不一样
2020-03-18 22:06
下凡小仙男
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2020-3-16
得分:0 
回复 19楼 叶纤
就是unsigned 少用吗 我今天看视频学到了这个就用了下哈哈哈
2020-03-18 22:06
hbccc
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:108
专家分:315
注 册:2020-2-18
得分:2 
第一个程序,由于a未赋值,运行时这个值时计算机随机给的,大概率时0,然后不会执行循环,只执行循环后面的printf语句,无符号数0减去1,就变成了最大值。
第二个程序,a赋值了1,就可以进行循环了,但while后只有a++,所以a就不停的自增,进入死循环,但a自增到最大值时,变为0,就可以跳出循环,这时执行printf,还是0-1,变成最大值。

[此贴子已经被作者于2020-3-18 22:41编辑过]

2020-03-18 22:39
下凡小仙男
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2020-3-16
得分:0 
回复 23楼 hbccc
2020-03-19 16:51
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用下凡小仙男在2020-3-18 22:06:03的发言:

就是两者之间为什么速度会不一样

因为你正确的代码是从1走到最大值,而错误的代码可能是从中间的垃圾值走到最大值。
前者路程远,当然耗时久。

而对于 无符号整型 和 具符号整型 的选择,C/C++的标准库中都是优先选用无符号整型。
因为前者在不需要表示负数的场合下,可以比后者表示的范围更大,那就不容易溢出。
在大部分CPU上,前者运算效率也高于后者。
更主要的是,具符号整型的溢出 属于 未定义行为
2020-03-19 18:14
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
以下是引用下凡小仙男在2020-3-18 22:06:59的发言:

就是unsigned 少用吗 我今天看视频学到了这个就用了下哈哈哈

无符号类型有它的优点,但是无符号类型也存在陷阱,所以并不是让你完全禁止使用,而是除非在特殊情况下或不可避免,否则请避免使用无符号数字
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-19 19:28
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:0 
回复 26楼 叶纤
无符号类型的确有一些容易出错的地方
但是你提到的根本不是无符号类型的问题
甚至是无符号类型的优点
有符号类型一样会出现溢出
并且有符号类型溢出是未定义行为
有可能回绕 有可能出现意料之外的情况
无符号类型溢出保证是回绕
是一个可以作为功能利用的机制
有符号类型溢出则不能作为功能利用

https://zh.
2020-03-20 01:10
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
回复 27楼 lin5161678
我已经把几大主题分的清清楚楚,如果看不懂请尝试完整的看一遍,如果看不懂c++代码,那你可以回炉了

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-03-20 11:01
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:0 
回复 28楼 叶纤
我看得懂你写的 你看不懂我写的
适合回炉的人显然是你才对
数字280太大,无法容纳0到255的1字节范围。大于类型的最大数字的1是256。因此,我们将280除以256,得到1个余数24。24的余数 被储存了。

然后呢 这个和无符号有什么关系
你用signed char ch = 280;
有符号不也一样结果24
那么问题来了
为什么 无符号类型 溢出结果24是缺点?
有符号类型 溢出结果24就不是缺点了??
牵强附会



[此贴子已经被作者于2020-3-20 11:17编辑过]


https://zh.
2020-03-20 11:14
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
回复 29楼 lin5161678
我全文没提过一次缺点二字,你在哪里看到的缺点?陷阱并非缺点,请不要强词夺理,避免并非禁止,请不要脑补内容

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-03-20 11:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-500418-1-1.html




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

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