C语言2进制和十进制问题

#include<stdio.h>

main()
{short int a=1000000000000000;
printf("%d\n",a);
}
我得到的数字是-32768 这个我看着挺对的 取补正好是负0
当我输入0+15个1的时候 得到的数字却是-28087
不是首位是0的话 得到的十进制数应该是正数吗?

我大致明白你的问题了

首先讲个概念吧,有符号int型数据的取值范围是-32768~32767,这个数是循环的

举个例子 int a=32767,那么:32767+1 = -32768; 32767+2 = -32767;依次类推,

在你列举的代码中,a=1000000000000000;这不是二进制表示,得到的结果或许是凑巧

如果是a=0x8000;才表示二进制1+15个0,0x8000转换为10进制正好是32767+1。

至于你说0+15个1应该表示为a=0x7fff; 正好是10进制的32767

呵呵,我补码什么的也说不明白,就用这种循环的说法吧,肯定是对的,你可以自己试验

要是有疑问再问吧,一起交流来自:求助得到的回答
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-26

    这个溢出的情况不能用常理来讲,你这个操作不是二进制操作,是代码层面上的,不是内存层面上的。

    而你讲的取补是内存层面上的,怎样存储的。

    .如果你想操作内存中的二进制数,要用这种指针(char*)&a指向的是内存中的二进制地址,我具体也没搞太明白,不过这个是我目前为止只在socket网编中看到,另外没什么用的,

第2个回答  2013-10-26
在c语言中2进制没办法直接输入 可以用16进制 4位2进制表示一位16进制
如果你要输入0+15个1的话 可以用16进制0x7FFF 表示2进制0111 1111 1111 1111

short int a=0x7fff 就行了追问

表示看不太懂 我所谓的1+15个0所得的数就是这个吧。。为什么我得到了这个数呢
既然你说我的操作不对

追答

a=1000000000000000 这个赋值实际上是取余
a=1000000000000000%65535
a放不下这么大的数
最后方的是1111 1111 1111 1111
按%d 输出 第一位是符号位 后面111 1111 1111 1111 所以输出-32768

第3个回答  2013-10-26
1000000000000000 是十进制数,不是二进制数。溢出了。
第4个回答  2013-10-26
short int 整型 2字节 -32768~32767
第5个回答  2013-10-26
...C语言写在代码里是没有2进制常数标识法的...只有16进制常数 要用0x开头 0x7FFF = 二进制的0111111111111111
0开头的常数会被当作八进制数处理 比如 011是十进制的 9

至于你为什么得到负数...是因为你溢出了.... short int范围应该是 -32768 到 32767

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网