你好,游客 登录 注册 搜索
背景:
阅读新闻

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

[日期:2017-08-15] 来源:Linux社区  作者:11674570 [字体: ]

我们知道,在C语言中存在无符号数和有符号数(一些高级语言如Java里面是没有无符号数的),但是对于计算机而言,其本身并不区别有符号数和无符号数,因为在计算机里面都是0或者1,但是在我们的实际使用中有时候需要使用有符号数来表示一个整数,因此我们规定,当最高位为1的时,表示为负数,最高位为0时,表示为正数。

1:有符号数和无符号数在数值上的区别。
有符号数的最高位用来表示符号,所以在最大的数值上,有符号数的最大值小于无符号数。以一个字节为例:
有符号数的取值范围为:-128 — 0 — 127
无符号数的取值范围为:0 — 255

2:正数和负数的转换
转换关系为:负数(正数) = 正数(负数)的补码 + 1;
例如:
5  = 0000 0101
-5 = 1111 1011
实际的计算:
最大值 - 当前值 +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
综上所述,计算机中的存储方式并不区分正负,关键在于程序员用什么方式去解析这块存储空间(地址)的值。

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-08/146260.htm

linux
相关资讯       C语言有符号数  C语言无符号数 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款