深入理解signed、unsigned 关键字
答:
1.-0 和+0 在内存里面分别怎么存储:
计算机里表示数字用的都是补码不是原码。想知道补码是啥可以去百度一下。零在计算机里就是0,不存在正负一说。0和正数的补码都等于原码,也就是平时说的2进制数。负数的补码是符号位置一的情况下,对原码求反,再加一得到的。经过这样的变换,负数和正数运算的时候可以直接做加法,不需要根据符号位决定是做加法还是做减法。减法也可以改变有符号数的符号位,然后直接做加法。这样CPU就不需要专门做减法的电路了。
十进制数 原码 反码 补码 +0 00000000 00000000 00000000 -0 10000000 11111111 00000000
2.就以类似的例子来描述: unsigned int a = 6; int b = -20; i+j=? 解释: unsigned int类型的数据与int类型的数据相运算后,自动转化为unsigned int类型。因此a+b的值不是-14,而是一个unsigned int类型的数4294967382. 1).先说下这个数字怎么来的: 在内存中,负数的存储方式是正数的反码+1. 6:0x00000006 20:0x00000014,补码:0xfffffffeb -20:0xfffffffec >>> 0xffffffec+0x06 4294967282L 2).%d,%u输出结果不一样? int 与unsigned存储形式一样,都是补码形式,区别在于输出的格式控制符,当以%d输出,会认为是有符号数,这样就把最高位的1当成了符号位,也就是负数(0是正数),当以%u输出,会认为是无符号数,这样它会将所有16位的组成都看成是数本身的组成,而没有符号位一说,所以输出结果是由16个1组成的二进制数。 这要看你的i+j的输出格式的,如果是%u 输出的话 那肯定是没有负数的。应该是一个很大的正数。但是以%d输出的话就会转成int 类型了 就会是-14了。
3.unsigned i = 9; for(i=9; i>0; i--) { printf("%u\n", i); } 为什么会出错。
因为:无符号数永远没有负数,恒大于等于0,死循环,。
