补码
之前看《深入理解操作系统》时候补码虽然当时理解了。一直没遇到,最近遇到了还是迷惑了我一下。写下来一下吧。
#include "pch.h"
#include <iostream>
int main()
{
int a1 = 0xffffffff; //11111111 11111111 11111111 11111111 -1
int a2 = 0x7fffffff; //01111111 11111111 11111111 11111111 2147483648
int a3 = 0xefffffff; //11101111 11111111 11111111 11111111 -268435457
int a4 = 0x01000000; //01000000 00000000 00000000 00000000 16777216
int a5 = 0x80000000; //10000000 00000000 00000000 00000000 -2147483648
int a6 = 0x00000000; //00000000 00000000 00000000 00000000 0
int a7 = 0x00000001; //00000000 00000000 00000000 00000001 1
std::cout << a1<<std::endl; // -1
std::cout << a2<<std::endl; // 214748364
std::cout << a3<<std::endl; // -2147483647
std::cout << a4<<std::endl; // 16777216
std::cout << a5<<std::endl; // -2147483647
std::cout << a6<<std::endl; // 0
std::cout << a7<<std::endl << std::endl; // 1
std::cout << (a1 >> 31) << std::endl; // -1
std::cout << (a2 >> 31) << std::endl; // 0
std::cout << (a3 >> 31) << std::endl; // -1
std::cout << (a4 >> 31) << std::endl; // 0
std::cout << (a5 >> 31) << std::endl; // -1
std::cout << (a6 << 31) << std::endl; // 0
std::cout << (a7 << 31) << std::endl; // -2147483647
}
我出错的地方就是>>31 而不是>>32
总结一下:往左移位最左边的位决定补位是0 or 1,反之一样。