鱼C论坛

 找回密码
 立即注册
查看: 4881|回复: 12

关于int型使用循环求最大正整数的问题

[复制链接]
发表于 2013-9-4 11:01:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 懒家大少 于 2013-9-4 14:23 编辑

什么都不说,先看代码。
  1. #include <stdio.h>

  2. /*
  3.         我的环境是VC++6.0
  4.         没错的话,是乘三次,也就是四个字节(不要忽略本身嘛,不就四个了吗)
  5. */
  6. void main(){
  7.         unsigned long byteSize;
  8.         int a, b;
  9.         int i;
  10.         byteSize = 256;        // 初始化变量,并赋予初值为一个字节的长度
  11.         for(i = 1; i < sizeof(int); i++){        // 防止编译器不一致,我这里使用循环算法,把正范围中最大值求出来
  12.                 byteSize *= 256;        // 就是让它不断乘以2的8次方,也就是一个字节。
  13.                 printf("第 %d 次计算的值是:%d\n", i, byteSize);
  14.         }        
  15.         a = byteSize / 2 - 1;        // 除二减一,这就是int的正整数最大值,我们可以打印看看。
  16.         printf("测试到的byteSize大小为:%d\n", byteSize);
  17.         printf("int型正整数最大值:%d\n", a);
  18.         b = a + 1;        // 测试+1后会有什么结果
  19.         printf("在int型前提下,%d + 1 = %d\n", a, b);
  20.         

  21.         /*
  22.         a = 2147483647;        // int型正整数最大值,也就是2的32次方除二减一
  23.         printf("%d\n",a);
  24.         ++a;        // 自增,也就是加一
  25.         printf("%d\n",a);

  26.         这个是简单算法,2的32次方除2减一,就是这个数,然后自增,就超了。
  27.         */
  28. }
复制代码
上面,哪里写错了呢
我得到的控制台结果是这样。
  1. 第 1 次计算的值是:65536
  2. 第 2 次计算的值是:16777216
  3. 第 3 次计算的值是:0
  4. 测试到的byteSize二进制为:0
  5. int型正整数最大值:-1
  6. 在int型前提下,-1 + 1 = 0
  7. Press any key to continue
复制代码
求解释。谢谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-9-4 13:40:15 | 显示全部楼层
{:2_26:}坐等大大们解救。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-4 13:48:37 | 显示全部楼层
这个  应该是溢出  导zhi-1的出现
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-4 13:51:17 | 显示全部楼层
再说了 怎么能打印出  二进制位   
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-4 14:23:19 | 显示全部楼层

其实,我想表达的是大小,呼呼···一时之间不知道怎么写。
溢出?
我知道是溢出。
但是long型这么大怎么都溢出呢···而且是无符号的,所以搞不懂。
新手求普及,谢谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-4 14:27:06 | 显示全部楼层
懒家大少 发表于 2013-9-4 14:23
其实,我想表达的是大小,呼呼···一时之间不知道怎么写。
溢出?
我知道是溢出。

这个不知道
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-4 14:43:38 | 显示全部楼层

也谢谢您的提醒,让我修改了名字
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-4 18:00:32 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <iostream.h>

  3. /*
  4.         我的环境是VC++6.0
  5.         没错的话,是乘三次,也就是四个字节(不要忽略本身嘛,不就四个了吗)
  6. */
  7. void main(){
  8.         __int64 byteSize;
  9.         int a, b;
  10.         int i;
  11.                 printf("%d %d\n",sizeof(int),sizeof(__int64));
  12.         byteSize = 256;        // 初始化变量,并赋予初值为一个字节的长度
  13.         for(i = 1; i < sizeof(int); i++){        // 防止编译器不一致,我这里使用循环算法,把正范围中最大值求出来
  14.                 byteSize *= 256;        // 就是让它不断乘以2的8次方,也就是一个字节。
  15.                 printf("第 %d 次计算的值是:%I64d\n", i, byteSize);
  16.         }        
  17.         a = byteSize / 2 - 1;        // 除二减一,这就是int的正整数最大值,我们可以打印看看。
  18.         printf("测试到的byteSize大小为:%d\n", byteSize);
  19.         printf("int型正整数最大值:%d\n", a);
  20.         b = a + 1;        // 测试+1后会有什么结果
  21.         printf("在int型前提下,%d + 1 = %d\n", a, b);
  22.         

  23.         /*
  24.         a = 2147483647;        // int型正整数最大值,也就是2的32次方除二减一
  25.         printf("%d\n",a);
  26.         ++a;        // 自增,也就是加一
  27.         printf("%d\n",a);

  28.         这个是简单算法,2的32次方除2减一,就是这个数,然后自增,就超了。
  29.         */
  30. }
复制代码
妥妥的搞定。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-5 09:54:56 | 显示全部楼层
liufei_vip 发表于 2013-9-4 18:00
妥妥的搞定。。。

有哪里改动了,指出下可以么?还是说你的编译器没问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-5 11:10:17 | 显示全部楼层
懒家大少 发表于 2013-9-5 09:54
有哪里改动了,指出下可以么?还是说你的编译器没问题。
  1. #include <stdio.h>
  2. #include <iostream.h>

  3. /*
  4.         我的环境是VC++6.0
  5.         没错的话,是乘三次,也就是四个字节(不要忽略本身嘛,不就四个了吗)
  6. */
  7. void main(){
  8.         __int64 byteSize;/////////////////////////////////////////////////
  9.         int a, b;
  10.         int i;
  11.                 printf("%d %d\n",sizeof(int),sizeof(__int64));////////////////////////////////////////////
  12.         byteSize = 256;        // 初始化变量,并赋予初值为一个字节的长度
  13.         for(i = 1; i < sizeof(int); i++){        // 防止编译器不一致,我这里使用循环算法,把正范围中最大值求出来
  14.                 byteSize *= 256;        // 就是让它不断乘以2的8次方,也就是一个字节。
  15.                 printf("第 %d 次计算的值是:%I64d\n", i, byteSize);////////////////////////////////////
  16.         }        
  17.         a = byteSize / 2 - 1;        // 除二减一,这就是int的正整数最大值,我们可以打印看看。
  18.         printf("测试到的byteSize大小为:%d\n", byteSize);
  19.         printf("int型正整数最大值:%d\n", a);
  20.         b = a + 1;        // 测试+1后会有什么结果
  21.         printf("在int型前提下,%d + 1 = %d\n", a, b);
  22.         

  23.         /*
  24.         a = 2147483647;        // int型正整数最大值,也就是2的32次方除二减一
  25.         printf("%d\n",a);
  26.         ++a;        // 自增,也就是加一
  27.         printf("%d\n",a);

  28.         这个是简单算法,2的32次方除2减一,就是这个数,然后自增,就超了。
  29.         */
  30. }
复制代码
改了那么多你没看出来???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-5 12:05:57 | 显示全部楼层
liufei_vip 发表于 2013-9-5 11:10
改了那么多你没看出来???

为什么要这样才能求呢?
还有,这是C程序?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-5 13:12:15 | 显示全部楼层
你打印一下sizeof(int)和sizeof(long)就知道了。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-9 09:02:05 | 显示全部楼层
回复@小龙闯天涯:新手不懂,求解释


                               
登录/注册后可看大图
来自 懒家大少 的新浪微博
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-6 03:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表