首页
社区
课程
招聘
[求助]重新学习了一下补码知识,结果发现这程序不正确
2014-7-1 13:36 4169

[求助]重新学习了一下补码知识,结果发现这程序不正确

2014-7-1 13:36
4169
int _tmain(int argc, _TCHAR* argv[])
{
        int orign = 0x000003E8; //  Decimal : 1000 原码:0000 0000 0000 0000 0000 0011 1110 1000
        int dc = 0x10000001; // Decimal : -1 原码: 1000 0000 0000 0000 0000 0000 00001
        printf("%d\n",orign - dc);
        return 0;
}

输出的结果是-268434457
不是应该结果为
orign[补] + dc[补] = 999 么。
为什么VC将dc作为无符号数了?
还是-1的 原码有错?

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞0
打赏
分享
最新回复 (11)
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whnet 2014-7-1 13:44
2
0
0x10000001  你再仔细翻译翻译。。。 这玩意 转成二进制可不是像你那样写的。。。

1000  != 1  

1000   == 8
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
hrpirip 1 2014-7-1 13:56
3
0
1000  != 1  

1000   == a
这两个是什么意思呢?
雪    币: 345
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jsjnwms 2014-7-1 14:04
4
0
int dc = 0x10000001; // Decimal : -1 原码: 1000 0000 0000 0000 0000 0000 00001

符号位是最高字节的最高位,不是最高字节的最低位,所以应该是0x80000001
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whnet 2014-7-1 14:07
5
0
对对对。应该是8 ... 我记错了。
雪    币: 168
活跃值: (823)
能力值: ( LV10,RANK:173 )
在线值:
发帖
回帖
粉丝
kaoyange 1 2014-7-1 14:22
6
0
1. 主要是-1的原码搞错了
2. 建议直接用补码表示计算
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
hrpirip 1 2014-7-1 14:25
7
0
我又测试了诸如 -3(0x80000003) -10(0x8000000A)
等数的十六进制形式,在这个程序中得到的结果始终为无符号数的加减结果。
怎么破?
难道是因为我减去了一个负数的原码,结果成为了一个加法?
雪    币: 168
活跃值: (823)
能力值: ( LV10,RANK:173 )
在线值:
发帖
回帖
粉丝
kaoyange 1 2014-7-1 14:33
8
0
你定义的0x80000003,计算机根本不认为是-3,你可以int -3,然后看看-3在内存中是如何表示的,其实是用补码的。
雪    币: 68
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
LowProfile 2014-7-1 14:43
9
0
。。。。-3怎么可能是0x80000003
0x80000000是最小的负数,就是-2147483648
0x80000003是-2147483645

-3的补码是0xFFFFFFFD

很多汇编书都说不清楚补码。。乱说一通。
《深入理解计算机系统》第二章是对整数编码的详细剖析,如果能坚持看完的话,一辈子都不会忘记补码的知识。
国内汇编书上说的神马取反加一,啥原理都不讲,看了也白看。
雪    币: 68
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
LowProfile 2014-7-1 14:45
10
0
网速太慢,重复发了一条,删掉。。
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
hrpirip 1 2014-7-1 14:55
11
0
用vc的自带调试发现:
        int dc = 0x80000001;
        int dcd = -1;

dc  = -2147483647
dcd = -1
雪    币: 1
活跃值: (1174)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SdKfz 2014-7-1 18:13
12
0
-1 是0xffffffff
= ~1 + 1
= ~00000001 + 1
= FFFFFFFE + 1
游客
登录 | 注册 方可回帖
返回