Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2857291
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-08-27 16:02:51

整数类型的储存
    我们前面所说的位运算都没有涉及负数,都假设这些运算是在unsigned/word类型(只能表示正数的整型)上进行操作。但计算机如何处理有正负符号的整数类型呢?下面两个程序都是考察16位整数的储存方式(只是语言不同)。

点击(此处)折叠或打开

  1. #include
  2. int main()
  3. {
  4.     short int a, b;
  5.     a = 0x0000;//内存值最小的时候
  6.     b = 0x0001;
  7.     printf("%d %d\n", a, b);
  8.     a = 0xFFFE;
  9.     b = 0xFFFF;//内存值最大
  10.     printf("%d %d\n", a, b);
  11.     a = 0x7FFF;//正数与负数的分界处
  12.     b = 0x8000;
  13.     printf("%d %d\n", a, b);
  14.     return 0;
  15. }
  16. /*
  17. 0 1
  18. -2 -1
  19. 32767 -32768
  20. Press any key to continue
  21. */



两个程序的输出均为0 1 -2 -1 32767 -32768。其中前两个数是内存值最小的时候,中间两个数则是内存值最大的时候,最后输出的两个数是正数与负数的分界处。由此你可以清楚地看到计算机是如何储存一个整数的:计算机用$0000到$7FFF依次表示0到32767的数,剩下的$8000到$FFFF依次表示-32768到-1的数。32位有符号整数的储存方式也是类似的。稍加注意你会发现,二进制的第一位是用来表示正负号的,0表示正,1表示负。这里有一个问题:0本来既不是正数,也不是负数,但它占用了$0000的位置,因此有符号的整数类型范围中正数个数比负数少一个。对一个有符号的数进行not运算后,最高位的变化将导致正负颠倒,并且数的绝对值会差1。也就是说,not a实际上等于-a-1。这种整数储存方式叫做“补码”。
阅读(796) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~