| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3742 人关注过本帖
标题:负数补码的问题
只看楼主 加入收藏
a9517495424
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:305
专家分:139
注 册:2011-7-20
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:7 
负数补码的问题
      假设一个数是 -3 ,先取整数的二进制码位 011 ,然后将所有位取反为 100 ,最后在末尾加 1 ,为 101 ,不够位时在前面补 1。 (假设占4个字节)那么为 11111111 11111111 11111111 11111101   ,那么如果得到这个数据,怎么才能知道这个是 -3 呢。



                                                      
搜索更多相关主题的帖子: 二进制 
2011-08-03 13:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:1 
二进制11111101这个数,既可以是十进制的253,也可以是十进制的-3,到底解释为前者还是后者,视程序对int的声明而定。如果声明的是unsigned int,则表示无符号整数,它是253,如果是signed int,则是-3,因为它的高位为1。

如果声明int,结果取决于编译器的默认配置!有些编译器设置为unsigned int,有些可能是signed int,而且那是可以人为设定的。因此,编写程序时,如何理解int的值,程序员必须彻底搞清楚,有时错误就是这样造成的。那个scanf()时输入5 8得到5为大的结果,就是这样来的,得到5之后接着的数据,高位为1,被解释成负数(空格32的二进制码是100000),所以输出5为大值。

授人以渔,不授人以鱼。
2011-08-03 14:18
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:1 
就比如一个负整数的绝对值可以这样算出来:
unsigned long absolute = ~iVar + 1;

只要iVar是负整数,在C里用这个就能得到它的绝对值。

程序代码:
#include <stdio.h>

int main(void) {
    int iVar = 0xFFFFFFFD;
    if(~iVar + 1 == 3)
        printf("它是-3");
    return 0;
}

这样行不?

My life is brilliant
2011-08-03 14:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我还真没专门测试过这方面的结果,因为遇到的机会极微。但可能正确吧,自己彻底弄一弄有益的。

授人以渔,不授人以鱼。
2011-08-03 14:32
qong
Rank: 2
等 级:论坛游民
帖 子:9
专家分:11
注 册:2011-8-2
收藏
得分:1 
只要最高位为1,一定是负数,不用犹豫,先写下一个负号,再对其进行~ 操作,加1,化为十进制
2011-08-03 15:30
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:1 
11111111 11111111 11111111 11111101   取反(注意最高位符号位为1,负数的标志)
00000000 00000000 00000000 00000010   +1
00000000 00000000 00000000 00000011   3

加上符号 -3

                                         
===========深入<----------------->浅出============
2011-08-03 16:41
Tothend
Rank: 1
等 级:新手上路
帖 子:9
专家分:4
注 册:2011-8-3
收藏
得分:1 
以下是引用laoyang103在2011-8-3 16:41:41的发言:

11111111 11111111 11111111 11111101   取反(注意最高位符号位为1,负数的标志)
00000000 00000000 00000000 00000010   +1
00000000 00000000 00000000 00000011   3

加上符号 -3
楼上正解。
这样是求负数的绝对值。
2011-08-03 17:14
a9517495424
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:305
专家分:139
注 册:2011-7-20
收藏
得分:0 
嗯~说得好
2011-08-03 19:37
快速回复:负数补码的问题
数据加载中...
 
   



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

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