读书人

负数二进构图示

发布时间: 2012-09-07 10:38:15 作者: rapoo

负数二进制表示
负数在计算机中用补码表示。这是教科书上到表示,由于时间久远,又由于上课没好好学,以至于补码是啥,在心中没留下任何到痕迹,补习一下。

原码:
整数在内存中用原码表示,即按绝对值大小转换成二进制
如: 000001015到二进制表示

反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码
如:00000101按位取反,得11111010

补码:反码+1
如:11111010+111111011,16进制表示位0xFB

二进制转换为10进制

int converse(string str) {  int result = 0;  int i, j;  const char *str_cstring = str.c_str();  for(i = 0; i < str.length(); i++) {    char ch = str_cstring[str.length() - i - 1];    int digital = ch - 48;    if (digital) {      result += 1 << i;    }  }  return result;}
  cout << converse("0101") << endl;  cout << converse("1101") << endl;

输出结果为:
5
13
上面到函数只能按原码转换,即只能转换非负数。

int converse2(string str) {  int result = 0;  int i, j;  const char *str_cstring = str.c_str();  int flag = str_cstring[0] - 48;  if (!flag) {    for(i = 0; i < str.length(); i++) {      char ch = str_cstring[str.length() - i - 1];      int digital = ch - 48;      if (digital) {        result += 1 << i;      }    }  } else {    int mask = 1;    for (i = 1; i < str.length() - 1; i++) {      mask += 1 << i;    }    for(i = 0; i < str.length() - 1; i++) {      char ch = str_cstring[str.length() - i - 1];      int digital = ch - 48;      if (digital) {        result += 1 << i;      }    }    result--;    result = ~result;    result &= mask;    result *= -1;  }  return result;}
cout << converse2("0101") << endl;  cout << converse2("1101") << endl;  cout << converse2("1111") << endl;  cout << converse2("1111111111111011");  cout << converse2("1111111111111111");


输出结果为:
5
-3
-1
-5
-1

注:实际上整形的数是32位的,在32位的情况下1101也是正数

读书人网 >编程

热点推荐