深入理解signed、unsigned 关键字

来源:互联网 发布:淘宝账号免费注册软件 编辑:程序博客网 时间:2024/05/29 05:01

深入理解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,死循环,。