| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1471 人关注过本帖
标题:long与int数值上界
只看楼主 加入收藏
prototype
Rank: 2
等 级:论坛游民
威 望:1
帖 子:21
专家分:32
注 册:2015-6-21
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
long与int数值上界
#include <stdio.h>
int main()
{
 int y,h;
 long j,k;
 printf("int型:\n");
 for(h=1;h>=0;h++)
 y=h;
 printf("h=%d             y=%d\n",h,y);
 printf("int的数值上界%d\n",y);
 printf("long型:\n");
 for(j=1;j>=0;j++)
 k=j;
 printf("h=%ld             y=%ld\n",j,k);
 printf("long的数值上界%ld\n",k);
getchar();
getchar();
      }
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: include 
2015-06-22 17:40
prototype
Rank: 2
等 级:论坛游民
威 望:1
帖 子:21
专家分:32
注 册:2015-6-21
收藏
得分:0 
long与int一样,C标准规定long不小于int,short不大于int
所以short的上界为32767

a man a plan a canal-panama
2015-06-22 17:42
一个小灰机
Rank: 2
等 级:论坛游民
帖 子:17
专家分:33
注 册:2015-3-14
收藏
得分:10 
这个不同的编译系统定义的不一样,可以在limits.h的头文件中查到
收到的鲜花
  • prototype2015-06-23 06:29 送鲜花  3朵  
2015-06-22 18:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
然后呢?

授人以渔,不授人以鱼。
2015-06-22 21:13
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
然后把结果打印出来呗,嘿嘿

梦想拥有一台龙芯3A-4000
2015-06-23 01:27
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
好嘛
2015-06-23 07:12
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
cpu字长

DO IT YOURSELF !
2015-06-23 07:44
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9032
专家分:54066
注 册:2011-1-18
收藏
得分:10 
楼主的代码是不正确的,因为 具符号整型的溢出是未定义行为。
即INT_MAX再加1后,C语言标准没有规定其为INT_MIN。
以你的代码 for(int h=1; h>=0; h++ ) ……; 为例,
因为 h一开始为正,每次循环又是递增,且C/C++语言不承认具符号整型的溢出,
所以导致你的代码被优化为一个死循环 for(int h=1; ; h++ ) ……。
我不知道你用的是什么编译器,但当今主流的前两大C语言编译器GCC/Clang,以O2编译你的代码,都会直接编译成一个死循环

假如你一定需要这样的代码,GCC/Clang法外开恩的提供了一个编译参数-fwrapv
2015-06-23 09:01
prototype
Rank: 2
等 级:论坛游民
威 望:1
帖 子:21
专家分:32
注 册:2015-6-21
收藏
得分:0 
有符号整数溢出:如果在一个'int'类型(比如)上的算术溢出,其结果是未定义的。一个例子是"INT_MAX+1"不保证是INT_MIN。这个行为启动了对某些代码是重要的某种类型的优化。例如,知道INT_MAX+1是未定义的,允许把"X+1 > X"优化为"true"。知道乘法“不会”溢出(因为这样做将是未定义的)允许把"X*2/2"优化为"X"。尽管这些可能看起来微不足道,这些事情通常通过内联及宏展开展露。这允许的一个更重要的优化是对像这样的"<="循环:

for (i = 0; i <= N; ++i) { ... }
在这个循环中,编译器可以假定该循环将实际迭代N+1次,如果"i"对溢出是未定义的,这允许各种循环优化的介入。另一方面,如果该变量被定义为对溢出回绕,那么编译器必须假定该循环可能是无限的(如果N是INT_MAX,这会发生)——这会禁止这些重要的循环优化。这特别地影响64位平台,因为如此多的代码使用"int"作为索引变量。

值得注意的是,无符号溢出被保证定义为2的补码溢出(回绕),因此你总是可以使用它们。使得有符号整数溢出有定义的代价是,失去这些类型的优化(例如,一个常见的症候是在64位平台上的循环中有大量的有符号扩展)。Clang与GCC都接受"-fwrapv"标记,它强制编译器把有符号整数溢出处理作有定义(除了INT_MIN除以-1)。

            ------------------------------------------------引自http://blog.

a man a plan a canal-panama
2015-06-24 06:22
prototype
Rank: 2
等 级:论坛游民
威 望:1
帖 子:21
专家分:32
注 册:2015-6-21
收藏
得分:0 
for(int h=1; h>=0; h++ )
是错误的,因为循环中并没有定义int h=1

a man a plan a canal-panama
2015-06-24 06:24
快速回复:long与int数值上界
数据加载中...
 
   



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

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