急!有关C语言的一些问题

来源:百度知道 编辑:UC知道 时间:2024/05/10 14:33:45
main()
{
unsigned a=32769,i=32768,j=65536;
printf("%d,%d,%u",a,i,j);
}
结果为-32727,-32768,0
是怎么得来的,详细一点,谢谢@\!!
“符号位是1代表此数是负数,负数在计算机中用补码表示,也就是-32768 ,加2就是1000000000000001,也就是-32767,所以会出现错误 ”意思是不是加1:10000000000000000 再求补码得到-10000000000000000原码-就是-32768;加2:1000000000000001再求补码得到原码就等于1111111111111111,第一位为符号位所以得到-32767.“内存以补码存放,输出来的时候又要还原成原码”
是这样吗?

int 型在计算机中以16位2进数存储表示,但事实上真正表示数值大小的只有15位,第十六位是符号位,1为负数,0表示正数,int型表示的范围为 -32768 ~ +32767
+32767=0(符号位,表示正数)111111111111111
如果数值再大,就会产生数据溢出的现象,比如说当32767加1
二进制数就变成10000000000000000
符号位是1代表此数是负数,负数在计算机中用补码表示,也就是-32768
,加2就是1000000000000001,也就是-32767,所以会出现错误

负数的补码就是负数的反码(除符号位以外按位取反,就是0变成1,1变成0)加1

%d是整数的
int 两个字节共八位,其中最前一位用来做符号位,而unsigned是无符号的,再输出的是整型,把最高一位当做了符号位,int 类型的上界是32767
如果想输出32769的话就把%d改为%u

计算机中的数是以二进制表示的,负数用补码来表示,32769和-32767的二进制码是一样的,int型的在16位机中有效位是16位。

+32769=1000000000000001
+32768=1000000000000000
-32767=1000000000000001
-32768=1000000000000000