关于低位数二进制数转换为高位二进制数的一些心得体会
2017-05-23 21:40
363 查看
最近被这样一道题弄哭,查了好多资料,才勉强弄懂,废话不多说,请看题。
#include "stdio.h" void main() { int8 a = -1; uint16 b; printf("%d",b); } A.0 B.1 C.255 D.65535
要弄清楚这个问题,我们首先要明确的是在计算机中,数据是以二进制补码的形式保存的,而显示给我们形态的是经过计算机转换而来的。 首先,我们来看看原码,反码,补码的关系: 以8位二进制为例,正数的原码、反码、补码相同, 负数的反码为:除符号位外,原码各位取反,反码加1,得负数的反码. 下面就对于原码,反码,补码详细分析一下: 原码:将一个整数,转换成二进制,就是其原码。如单字节的5的原码为:0000 0101;-5的原码为1000 0101。 反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。如单字节的5的反码为:0000 0101;-5的反码为1111 1010。 补码:正数的补码就是其原码;负数的反码+1就是补码。如单字节的5的补码为:0000 0101;-5的原码为1111 1011。 在计算机中,正数是直接用原码表示的,如单字节5,在计算机中就表示为:0000 0101。 负数用补码表示,如单字节-5,在计算机中表示为1111 1011。 所以回到刚开始的题目,-1(8位有符号整形)的原码为10000001,当其被强制转换为无符号16位整形时,-1的原码转换为1000000000000001(扩展原则为符号位不变,增加的位用0代替),则其补码为0xFFFF(1111111111111111),由于这串二进制的数据类型定义为无符号,计算机把这段补码看成是正数的补码,由前面的论述可知,正数的补码即为原码(of course,无符号数当然都是正数了),即计算机输出显示给我们看到的这串数据即为0xFFFF(16进制),所以输出的结果也就是选项D了。 至于其他的,我总结如下: 同理可得(哈哈哈), 本人也是非科班出身的C语言爱好者,如有不正确的地方,请评论区指教。
相关文章推荐
- 关于如何在CString和char*之间转换的一些心得
- 关于windows句柄机制的一些心得体会
- 关于对vuex使用过程中的一些心得体会
- 关于Hiberante存储CLOB的一些心得体会
- 关于架构的一些心得体会
- 关于WPF中使用AxWindowsMediaPlayer的一些心得体会
- 关于网络推广的一些心得体会
- 关于游戏创作一些体会和心得
- 关于string的一些心得体会
- 关于java空指针一些心得体会
- 关于水题hdu-2008的一些心得体会。。
- 关于java数据转换的一些体会!
- 阅读一些关于软件开发本质和开发方法的文章的体会与心得
- 转: 谈谈关于内存的一些心得体会
- 关于solr的一些心得体会
- 关于使用Axure RP进行原型开发的一些心得体会
- 关于代码的一些心得体会(大神勿喷)
- 关于学习linux的一些心得体会
- 关于NSTask使用的一些心得体会
- 关于java关键字synchronized的一些心得体会