| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3599 人关注过本帖
标题:[求助]如果一个值溢出某个变量的数据类型存储范围,但仍然存入该变量,那么 ...
只看楼主 加入收藏
吐歌
Rank: 2
等 级:论坛游民
帖 子:43
专家分:19
注 册:2014-10-19
结帖率:100%
收藏
 问题点数:0 回复次数:5 
[求助]如果一个值溢出某个变量的数据类型存储范围,但仍然存入该变量,那么存入该变量中的值实际上是什么
如果一个值溢出某个变量的数据类型存储范围,但仍然存入该变量,那么存入该变量中的值实际上是什么
2014-10-19 08:36
魑魅魍魉!
Rank: 3Rank: 3
来 自:亲爱MM肚子里!
等 级:论坛游侠
威 望:1
帖 子:61
专家分:149
注 册:2014-5-3
收藏
得分:0 
溢出存储范围了,还能存么?
应该是由编译器决定吧!
2014-10-19 10:13
吐歌
Rank: 2
等 级:论坛游民
帖 子:43
专家分:19
注 册:2014-10-19
收藏
得分:0 
也就是说不确定吗?

||||||||||||^_^COMEONFORGOODLIFE^_^||||||||||||
2014-10-19 10:24
吐歌
Rank: 2
等 级:论坛游民
帖 子:43
专家分:19
注 册:2014-10-19
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>

int main()
{
    unsigned int k=1,i,n,s=0;
    scanf("%d",&n);
    for(i=1; i<=n; i++)
    {

        k=k*i;

        s+=k;
    }
    if(k!=0&&s>0&&k
       >0)
        printf("%u",s);
    else
        puts("overflow");
    return 0;
}
此编码中if(k!=0&&s>0&&k
       >0)
有什么作用?

||||||||||||^_^COMEONFORGOODLIFE^_^||||||||||||
2014-10-19 10:35
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:0 
简单说说:
是这样的 我们先从简单的说起:
假设只有2个bit:  能保存 00  01  10  11 四种状态我们分别定义
   整数0=00  整数1=01 整数2=10  整数3=11
假设只有3个bit:  我们在最高位加入符号位 如果是1就是负数并且用补码表示
能保存 000  001  010  011 100 101  110 111 八种状态我们分别定义(也是计算机定义)
 -4=100  -3=101    -2=110  -1=111   0=000  1=001 2=010  3=011  
我们可以看到3+1= ?   011 +1 = 100  竟然是-4   再加就是100+1=101 果然是-3
这样正好首位详解 构成一个循环  所以正向越界 从负的最大数开始往数轴正向走起
同样负向越界也会从数轴的最大数 往左走起

我想你已经知道答案了吧
2014-10-19 17:23
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
对于C/C++:
    若为无符号整型,其结果为“模除 所能表示的最大值+1”,也就是俗语(当然不严格)说的“从低位开始截断”;
    若为具符号类型,其结果未定义
    若为_Bool类型,非0即真,0即假
    若为浮点类型,+-INF

--- 假如你是初学者,别往下看了,免得你看糊涂了 ---
C之所以规定“若为具符号类型,其结果未定义”,只是因为当时CPU种类多,没法规定而已,而不是为了“优化”。所以如果了知当前CPU架构,你可以写出这样的“未定义”代码,不用担心。这就是为了某些开源代码中这么用,但却没有人说它错的原因。
当初的目的虽非为了“优化”,但既然是“未定义”了,就可以用于“优化”,所以若你一定要用这样的“未定义”代码,你得避开一切可能的优化,比如 for( int i=1; 0<i; ++i )
i一直在自增,最后会变为负数,导致循环终止?不是所有的编译器上都如你所愿。因为C标准规定具符号类型溢出行为未定义,因此编译器可以认为i永不溢出,即将for( int i=1; 0<i; ++i ) 优化为 for( int i=1; ; ++i )
2014-10-20 09:04
快速回复:[求助]如果一个值溢出某个变量的数据类型存储范围,但仍然存入该变量, ...
数据加载中...
 
   



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

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