4294967295 二进制//1111 1111 1111 1111 1111 1111 1111 1111 == 2

问题描述:

4294967295 二进制//1111 1111 1111 1111 1111 1111 1111 1111 == 2^31 +2^30+ 2^0?
#include
int main()
{
short a=-1;
printf("%u\n",a);//short类型为什么会表示4294967295 //明明超过俩个字节!
}
1个回答 分类:综合 2014-11-29

问题解答:

我来补答
用补码存储的呢
-1 原码 1000 0000 0000 0000 0000 0000 0000 0001
按位求反1111 1111 1111 1111 1111 1111 1111 1110 //符号位不变
+1 1111 1111 1111 1111 1111 1111 1111 1111
所得就是补码
再问: 4294967295 二进制//1111 1111 1111 1111 1111 1111 1111 1111 == 2^31 +2^30+ 2^0?
再答: 嗯,等于
再问: 那2^32 -1 等价于 2^31 +2^30+ 2^0?
再答: 是撒,等比数列,你可以算算。
再问: 是有符号数,你用 %u 格式输出,这里做了 强制转换: (unsigned long int) a unsigned long int//是8个字节吧?8*8=64位呀!?//为啥强转为unsigned long int//而不是int呢?
再答: 我不认为是做了转换的,一个数本来就有两种形式,原码形式和补码形式。正数的原码和补码一样的。如果是进行减法运算就用数的补码进行运算,输出时默认是输出原码形式,%u只是告诉编译器这儿要输出补码形式,显然原码和补码二进制位相等。 我是说没记错嘛,unsigned long int、unsigned int、long int、int在32位系统下都是4个字节,刚刚测试了的,64位系统下貌似是你说的那样的。
再问: short类型为什么会表示4294967295 ?//明明超过俩个字节! 输出时默认是输出原码形式,%u只是告诉编译器这儿要输出补码形式//%u不算输出的吗?为啥又用补码形式? 显然原码和补码二进制位相等//啥用处?
再答: 1.额,%u标示打印unsigned int http://en.wikipedia.org/wiki/Printf_format_string上面说了的,所以虽然a是short型的,也是打印unsigned int 2.上面的补码形式是我的理解,因为-1是负数,现在%u又要输出一个正数,只有输出等价的补码形式了,补码是正的。 3.答案1应该是把所有的问题都解决了吧
 
 
展开全文阅读
剩余:2000