c++中整数在内存中的存储(左移右移)

整数的正数,负数,以及无符号整数的表示方法有什么区别呢?
对于正整数来说,内存里装的就是它自己的二进制码;
而负数呢,是对齐相应的整数,逐位求反,然后+1。

负数的最高位都是1,不是规定的,而是算出来的结果,最高位必为1;
根据上述算法-1 不是0x80000001 而是0xFFFFFFFF。
介绍一下左移<<和右移>>的计算.
左移:


  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(){
  4.         int a = 0x80000001;
  5.         int b = 0x70000000;
  6.         int c = 1;

  7.         printf("a:%x(%d)\n", a<<1, a<<1);
  8.         printf("b:%x(%d)\n", b<<1, b<<1);
  9.         return 1;
  10. }
  11. a:80000000(-2147483648)
  12. b:2(2)

左移相对比较简单,是不考虑符号位的,符号位也会被移除,正数可能左移成负数,负数也可能编程正数

而右移呢,就需要考虑符号位了。右移过程中符号位保持不变,但注意符号位如果是1也是右移给右侧一位的,虽然自己不变。


  1. int main(){
  2.         int b = 0x80000001;

  3.         printf("b:%x\n", b>>1); 
  4.         return 1;
  5. }

  6. [zhouqz@fb119 ~]$ ./a.out 
  7. b:c0000000
上例的结果既不是0x40000000也不是0x00000000,居然是0xc0000000(1100 0000 0000 ....)

那么无符号有什么区别么?左移来说,没有任何区别,但对于右移来说,因为无符号整数表示最高位不是符号位,右移就可以移动了
所以0x80000000 >> 1 就是0x40000000了



你可能感兴趣的:(C++自己的笔记,内存,二进制,C++)