2010-09-25 60 views
1

我正在编写一个将二进制字符串转换为十进制的程序。我想在我真正开始使用这种方法之前验证我的输出。我有以下代码:C++奇怪的输出将字符串转换为int

int get_val() 
    { 
     int sum =0; 
     for(int num_bits = size; num_bits>0; num_bits--) 
     { 
      printf("String sub %i is %i\n", num_bits, int(bin[num_bits])); 
     } 
    } 

当我输入16个零的字符串,我得到下面的输出:

String sub 16 is 24 
String sub 15 is 0 
String sub 14 is 0 
String sub 13 is 0 
String sub 12 is 23 
String sub 11 is 0 
String sub 10 is 0 
String sub 9 is 0 
String sub 8 is 22 
String sub 7 is 0 
String sub 6 is 0 
String sub 5 is 0 
String sub 4 is 21 
String sub 3 is 0 
String sub 2 is 0 
String sub 1 is 0 

为什么我敢打赌得到不同的值,如果我输入全部为零?

编辑:BIN为“0000000000000000”

+2

你似乎缺少一些代码。 – 2010-09-25 21:45:26

+1

什么是'bin'数组? – 2010-09-25 21:45:46

+2

请问您可以发布代码的其余部分,特别是bin []是什么? – schnaader 2010-09-25 21:45:53

回答

1

只要不更新的问题,也许这个例子的代码有帮助。它将二进制字符串转换为整数。我尽量保留尽可能多的代码和变量名称。

#include <stdio.h> 
#include <stdlib.h> 
#include <string> 

using namespace std; 

int main() { 
    string bin = "000111010"; 
    int size = bin.length(); 
    int sum = 0; 
    for(int num_bits = 1; num_bits <= size; num_bits++) { 
     sum <<= 1; 
     sum += bin[num_bits - 1] - '0'; 
    } 
    printf("Binary string %s converted to integer is: %i\n", bin.c_str(), sum); 
} 

前面已经说过的意见,这里主要的窍门是转换成ASCII字符“0”和“1”到减去“0”值来完成整数0和1。另外,我改变了字符串的遍历顺序,因为这样可以在每一位之后移动整数,并且总是设置当前最低位的值。

0

简短的回答,你不会。

很长的答案,这里有几个问题。第一个大问题是,如果我们假设bin是长度为“size”的标准字符数组,那么您的第一个打印是无效的。数组的索引是关闭的1。考虑代码示例:

int size = 16; 
char * bin = new char[size]; 

for(int i=0; i<size; i++) 
{ 
    bin[i] = 0; 
} 

for(int num_bits = size; num_bits>0; num_bits--) 
{ 
    printf("String sub %i is %i\n", num_bits, int(bin[num_bits])); 
} 

主要生产:

String sub 16 is -3 
String sub 15 is 0 
String sub 14 is 0 
String sub 13 is 0 
String sub 12 is 0 
String sub 11 is 0 
String sub 10 is 0 
String sub 9 is 0 
String sub 8 is 0 
String sub 7 is 0 
String sub 6 is 0 
String sub 5 is 0 
String sub 4 is 0 
String sub 3 is 0 
String sub 2 is 0 
String sub 1 is 0 

通过你得到了实际产量来看,我猜你不喜欢的东西:

int size=16; 
int * ints = new int[size]; 
char * bin; 

//Fill with numbers, not zeros, based on the evidence 
for(int i=0; i<size; i++) 
{ 
    ints[i] = 20 + i; 
} 

//Copy over to character buffer 
bin = (char*)(void*)&(ints[0]); 

for(int num_bits = size; num_bits>0; num_bits--) 
{ 
    printf("String sub %i is %i\n", num_bits, int(bin[num_bits])); 
} 

这解释了您完美看到的输出。所以,我在考虑你的输入假设,即bin指向一组字符零,这是不正确的。这有几个很大的问题,假设你做了这样的事情。

  1. 你的假设内存是所有零是错误的,你需要解释或发布真正的代码,我们将
  2. 你不能只是把一个整数的内存缓冲区的字符 - 字符串是由一个字节的字符(典型的),整数是4个字节,典型地
  3. 阵列在C++中从0开始,而不是1
  4. 铸造一个字符的整数[INT(“0”)]不智能地转换 - 出来的整数是小数点48,而不是小数点0(有一个函数atoi会这样做,以及其他更好的函数,或者其他建议使用减法)