码迷,mamicode.com
首页 > 其他好文 > 详细

在2147483647的边缘疯狂试探

时间:2018-11-01 11:48:19      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:个数   实验   com   code   .com   c 语言   输出   int   amp   

2147483648的缘起

最近其实一直都在是摸鱼的状态,编程也很少了。其实自己真的想有一段时间啥都别顾及的只是敲代码就行了的时光。说我怠惰也好,现在感觉就是我干什么都有一种没有用的感觉。

这次碰到的这个问题源于我们C 语言课上的实验

#include <stdio.h>

int main()
{
    int max(int x,int y);
    int a,b,c;
    while (1){
    printf("input a&b: ");
    scanf ("%d,%d",&a,&b);
    c=max(a,b);
    printf("max=%d\n",c);
}
    return 0;
}

int max(int x,int y)
{
    int z;
    if (x>y) z=x;
    else z=y;
    return z;

}

本来也没什么,只是突然间有位老哥好像发现了新大陆

技术分享图片

”哦豁,爆掉了“= =,输入超大的数最后反而会输出一个根本不在两者之间的负数。

立刻丢掉了无聊的实验内容,开始研究这个问题的本质。其实就是数据溢出吧。

实验内容

其实之前还是了解了一下,int的范围在vc6里是-231~231-1,也就是-2147483648~2147483647。于是便开始疯狂试探。

技术分享图片
技术分享图片

的确是2147483647的力量。

但现在有一个新的疑问便是 -1141710350 又是从何而来的呢?

监视变量

说来惭愧...我之前编程为了查看一个变量里的内容,不停的用print,messagebox。。
知道现在知道可以用监视
技术分享图片
可以发现一赋值123412341234就立马变成了-1141710350

这时还是请出程序猿计算器吧。。

从上面的测试可以看出,这个数是与123412341234有关的

而它的二进制编码是?0001 1100 1011 1011 1111 0010 1110 0001 1111 0010?

而如果只保留32位的话便成了1011 1011 1111 0010 1110 0001 1111 0010 这里恰恰就是 -1141710350 的二进制代码。

技术分享图片
ps:位键盘真好玩= =

在2147483647的边缘疯狂试探

标签:个数   实验   com   code   .com   c 语言   输出   int   amp   

原文地址:https://www.cnblogs.com/FSpark/p/9886727.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!