二进制补码的转换问题

工作中需要的一份数据协议中用到了二进制补码,于是查询关于二进制补码还原的代码…
查到的结果是说正数的结果是其本身,负数需要取反+1,即(b=~a+1,符号位不变)。
要研究详细理论,请自行查询学习。
结果不对!
于是就研究了一下,其实结果就是不需要转换。代码中,直接取出来就可以了。
一下验证过程,可以跳过了…
C++测试。

    int A777 = -7;
    __int32 A77 = 0xFFFFFFF9;
    __int32 A7 = 0xFFFFFFF9;
    __int32 A = 0xFE08F368;//-32967832
    __int32 AA = -32967832;

    __int32 b = (~A7) | 0x80000000 + 1 ;//-2114515817

	printf("%X\n", A77);
	printf("%X\n", A777);
	printf("%X\n", A);

输出结果:

到这里,看到-7的十六进制表示结果就是二进制补码。
也就是说,所有的负数在计算机中,已经是二进制补码形式存在,不需要转换,至于网站上的转换方法是理论方式,当然也是计算机实现方式,只是对程序员是透明的。
当然还有一处可以验证,就是计算器。

BIN行和Hex行,都是显示的二进制补码,而不是原码。
所以,结论就是,计算机中已经将补码透明化了。

而且,还测试了C#、Java、以及Ubuntu下C++,都是这样的。如果不信,请自行验证。
如有问题,欢迎交流讨论。

更多推荐

二进制补码源码转换c++代码十六进制测试转换取反加一结果不正确不需要转换