C语言之有符号数和无符号数

咱们知道,在C语言中存在无符号数和有符号数(一些高级语言如Java里面是没有无符号数的),可是对于计算机而言,其自己并不区别有符号数和无符号数,由于在计算机里面都是0或者1,可是在咱们的实际使用中有时候须要使用有符号数来表示一个整数,所以咱们规定,当最高位为1的时,表示为负数,最高位为0时,表示为正数。程序员

1:有符号数和无符号数在数值上的区别。ide

有符号数的最高位用来表示符号,因此在最大的数值上,有符号数的最大值小于无符号数。以一个字节为例:spa

有符号数的取值范围为:-128 — 0 — 127it

无符号数的取值范围为:0 — 255table


2:正数和负数的转换class

转换关系为:负数(正数) = 正数(负数)的补码 + 1;变量

例如:原理

5  = 0000 0101程序

-5 = 1111 1011top

实际的计算:

最大值 - 当前值 +1;

0xFF -5 +1 = -5(1111 1011)

0xFF -(-5) +1 = 5(0000 0101)


3:正负数在计算机中的存储

在计算机中,并不存在所谓正负,具体看下面的代码

int main(void)
 {
        int x = -1;
         int i = 0;
      unsigned int ux = (unsigned)x;
        for(i = 0;i<32;i++)
         {
                 ux = ux >> i;
                if((ux & 0x01) == 0)
                         printf("%d = 1\r\n",i);
         }

    ux = (unsigned) x;

    printf("ux = %d \n",ux);

    printf("ux = %u \n",ux);

}

运行结果为:

111111111(32个1)

ux = -1

ux = 4294967295

缘由是,当咱们将 -1 经过强制类型转换赋值给ux时,此时ux变量所对应的地址,所存放的值是-1,也就是0xFFFFFFFF,也就是说,从存储的角度上讲,-1和4294967295在计算机的存储值都是0xFFFFFFFF,关键是你按怎样的方式去解析,

ux = -1;此时咱们是按%d也就是有符号×××的方式去解析这个存储空间所对应的值,因此获得的解析结果是-1;

ux = 4294967295,此时咱们是按%u也就是无符号×××的方式去解析这个存储空间的值,因此获得的最高位就是数值位,而不是符号位。

解析过程以下,这里假设int类型为一个字节(4个字节也是同样的原理,只是数值更大而已)

                          255
                            -1
 位
   值
     位
    值
1
1
1
1
1
2
1
2
1
2
4
1
4
1
4
8
1
8
1
8
16
1
16
1
16
32
1
32
1
32
64
1
64
1
64
128
1
128
1
-128

因此

-1 = 1+2+4+8+16+32+64+(-128)

255 = 1+2+4+8+16+32+64+128

综上所述,计算机中的存储方式并不区分正负,关键在于程序员用什么方式去解析这块存储空间(地址)的值。