您的位置:首页 > 编程语言 > C语言/C++

深入理解signed、unsigned 关键字

2017-07-12 11:09 465 查看
深入理解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,死循环,。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息