| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6163 人关注过本帖
标题:-2147483648的补码怎么算?
只看楼主 加入收藏
edwardflee
Rank: 4
等 级:业余侠客
帖 子:145
专家分:234
注 册:2011-7-27
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
-2147483648的补码怎么算?
在学《C程序设计》,练习编了个小程序计算int型数的补码。
按书上的方法,负数先求绝对值,然后写成二进制,在各位取反后加1
我试了试,别的都行,最小数-2147483648算出来不对,貌似一取绝对值就已经溢出了吧?
怎么办?还用这种方法计算?还是这个数有别的计算方法?
程序代码:
/*
时间:2011年9月30日15:41:07
目的:练习补码的计算方法
*/
# include <stdio.h>

int main()
{
    int x;
    int i;
    int a[32];
    printf("输入一个数\n");
    scanf("%d",&x);
   
    if (x>=0)
    {
        a[0]=0;                                //正整数计算补码
        for(i=31; i>0; --i)
        {
            a[i]=x%2;
            x /= 2;
        }
    }
    else
    {
        x = -1*x;                            //取绝对值
        a[0]=0;                                //按正整数计算补码
        for(i=31; i>0; --i)
        {
            a[i]=x%2;
            x /= 2;
        }
        for(i=0; i<32; ++i)                    //逐位取反
        {
            a[i] = !a[i];
        }
        for(i=31; i>=0; --i)                //+1
        {
            if(0==a[i])
            {
                ++a[i];
                break;
            }
            else
            {
                --a[i];
                continue;
            }
        }
    }
   
    printf("补码是:\n");
    for(i=0; i<32; ++i)
    {
        printf("%d",a[i]);
        if(3 == i%4)
        {
            printf(" ");
        }
    }
    printf("\n");
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入一个数
-2147483648
补码是:
0000 0000 0000 0000 0000 0000 0000 0000
Press any key to continue
————————————
*/

搜索更多相关主题的帖子: C程序设计 取绝对值 计算方法 二进制 
2011-09-30 15:48
thlgood
Rank: 5Rank: 5
等 级:职业侠客
帖 子:281
专家分:381
注 册:2010-9-24
收藏
得分:3 
额。。赶着上课,先Mark下,回来再写。。。

o(∩∩)Linux & Python 群:187367181
2011-09-30 16:15
edwardflee
Rank: 4
等 级:业余侠客
帖 子:145
专家分:234
注 册:2011-7-27
收藏
得分:0 
回复 2楼 thlgood
好呀好呀,等你啦美女

学C的秘诀=每天都来泡论坛
2011-09-30 16:28
A13433758072
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广东潮州
等 级:小飞侠
威 望:1
帖 子:1182
专家分:2784
注 册:2010-7-22
收藏
得分:3 
回复 楼主 edwardflee
函数名: abs
功 能: 求整数的绝对值
头文件:math.h
函数原型:int abs(int i); 有这函数为什么不用

一步一个脚印...............................默默地前进.....
诚邀乐于解答c菜鸟问题,的热心网友加入,  QQ群38490319
2011-09-30 17:17
hjywyj
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:1114
专家分:2611
注 册:2010-4-14
收藏
得分:3 
有现成的函数为啥不用?
让这个数自动转换为二进制放在字符串中
然后再转为补码难道还难吗?
2011-09-30 17:25
吴军旗
Rank: 5Rank: 5
等 级:职业侠客
帖 子:286
专家分:308
注 册:2011-9-14
收藏
得分:3 
回复 3楼 edwardflee
色啊

最惨的不是忘不了悲伤的回忆,而是那些悲伤的回忆却开始记不清。。。
2011-09-30 17:46
czsbc
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:469
专家分:1700
注 册:2008-12-13
收藏
得分:3 
貌似int 型只能表示-2147483648 到 2147483647

2011-09-30 17:47
czsbc
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:469
专家分:1700
注 册:2008-12-13
收藏
得分:0 
程序代码:
#include <stdio.h>

int main()
{
    int x;
    int i;
    int a[32];
    printf("输入一个数\n");
    scanf("%d",&x);
   
    if(x<0)
    {
        x+=2147483648;
        a[0]=1;
    }
    else
        a[0]=0;
                             
    for(i=31; i>0; --i)
    {
        a[i]=x%2;
        x /= 2;
    }

    printf("补码是:\n");
    for(i=0; i<32; ++i)
    {
        printf("%d",a[i]);
        if(3 == i%4)
        {
            printf(" ");
        }
    }
    printf("\n");
    return 0;
}
收到的鲜花
  • edwardflee2011-10-05 20:41 送鲜花  5朵   附言:好办法,谢谢
2011-09-30 17:56
yixiu868
Rank: 2
等 级:论坛游民
帖 子:28
专家分:22
注 册:2010-10-25
收藏
得分:3 
int型4个字节没法表示2147483648
2011-09-30 18:02
thlgood
Rank: 5Rank: 5
等 级:职业侠客
帖 子:281
专家分:381
注 册:2010-9-24
收藏
得分:0 
程序代码:
/*

 *Filename:      main.c

 *Created:      2011年09月30日 16时07分38秒

 *Author:      thlgood

 */
#include <stdio.h>
#include <string.h>
#define MAX 500

int main()
{ 
    char fanma[MAX];
    char *p = &fanma[MAX-1];
    int yuanma;
    int flags = (MAX-2);

    printf("输入原码:");
    scanf("%d", &yuanma);
    yuanma  = (-1) * yuanma;

    *p = '\0';
    while (0 != yuanma)
    {
        p--;
        if (yuanma%2)
        {
            *p = '0';
        }
        else
        {
            *p = '1';
        }
        yuanma /= 2;
    }
    printf("%s\n", p);
    if (fanma[flags] == '0')
    {
        fanma[flags] = '1';
    }
    else
    {
        while (fanma[flags] != '0')
        {
            fanma[flags] = '0';
            flags--;
        }
        fanma[flags] = '1';
    }
    printf("%s\n", p);

    return 0;
}
收到的鲜花
  • edwardflee2011-10-05 20:43 送鲜花  5朵   附言:为什么散分结贴不给贴代码的朋友给分呢?

o(∩∩)Linux & Python 群:187367181
2011-09-30 19:07
快速回复:-2147483648的补码怎么算?
数据加载中...
 
   



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

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