求解下列C语言程序运算结果中b中最后的数65535是怎么算出来的,还有-1的存储形式怎么是1111111111111111?

2024-11-06 16:52:08
推荐回答(4个)
回答1:

一、-1在计算机中以补码形式存储,在16位的编译系统中,-1的补码是1111111111111111;在32位的编译系统中,-1的补码是11111111111111111111111111111111;根据运行结果,你是情况属于16编译系统;
二、-1的补码1111111111111111以无符号整数%u输出就是65535。即(65535)10=(1111111111111111)2。

回答2:

你这个问题非常有意义。

虽然我们都知道浮点数的格式定义在IEEE 754,我们可以换算出你定义的值。但是你这里打印的却不是我们换算出来的值,说明这样打印的方法有问题。

可以做以下试验证明:比如你定义3个一样的浮点数,float a, b ,c; a = b = c = 9.0;

理论上编码方式一样,打印出来就应该一样(无论值是什么)。可是用你的方法打印出来的结果是不一样的!!!哈哈!

具体原因我也不清楚,一直想在内存里面实际看看,最近工作忙,一直没有对比过。我怀疑是地址选择有些问题。也许用 printf("%x %x %x\n", *((unsigned int *) &a), *((unsigned int *) &b), *((unsigned int *) &c)); 打印可以解决问题。你可以试试看。或者用调试工具吊起来实际看看。
.
希望能够帮助你 ^_^ 也希望能够选为最佳答案!

回答3:

取反加一,因为1的二进制码是:0000 0000 0000 0001,取反:1111 1111 1111 1110,加一:
1111 1111 1111 1111,这就是-1的补码了,也就是-1的二进制表示。
又如-2,首先2的二进制是0000 0000 0000 0010,取反1111 1111 1111 1101,加一:
1111 1111 1111 1110,这就是-2的二进制了,其他的负数都以此类推,用对应的正数二进制“取反加一”就得到了

回答4:

-1二进制表示为10000000000000001,负数用反码表示为1111111111111111

%u无符号整数,范围是0-65535,所以1111111111111111就是65535