Попытка объединить двоичные числа в одно значение - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь объединить целые числа, превратив их в строку, а затем превратить их обратно в целое число, чтобы сложить в одну строку / целое число. Я использую пример конкатенации, который я получил от Google, но он не работает, и я понятия не имею, почему

Я пробовал другие примеры concat, но они тоже не работали. Также попробовал х * 10 х + у так как я работаю с однозначными числами / бинарные

Это моя функция concat

int concat(int a, int b)
{

    char s1[20];
    char s2[20];

    sprintf(s1, "%d", a);
    sprintf(s2, "%d", b);

    strcat(s1, s2);

    int c = atoi(s1);

    return c;
}

а это остальное

for (i = 0; i < countr+1; i++)
    {
        b = theArr[i];
        r = 0;
        count = 0;
        if (b < 0) 
        {
            tempval = (unsigned int)b;
            while (tempval != 0) 
            {
                n = tempval % 2;
                tempval /= 2;
                m[r] = n;
                count += 1; r++;

            }
            for (k = count - 1; k >= 0; k--) 
            {
                printf("%d", m[k]);
                if (tempC == 0) 
                {
                    testOutput = m[k];
                    tempC++;
                }
                else
                {
                    testOutput = concat(testOutput, m[k]);
                }
            }
            tempC = 0;
            printf("\nHERE:%d\n", testOutput);
            printf("\n");
        }else 
        {
            while (b != 0) 
            {
                n = b % 2;
                b /= 2;
                m[r] = n;
                count += 1; r++;

            }
            for (k = count - 1; k >= 0; k--) 
            {
                printf("%d", m[k]);
                printf("%d", m[k]);
                if (tempC == 0)
                {
                    testOutput = m[k];
                    tempC++;
                }
                else
                {
                    testOutput = concat(testOutput, m[k]);
                }
            }
            tempC = 0;
            printf("\nHERE:%d\n", testOutput);
            printf("\n");
        }
    }

В массиве "m" есть либо 1, либо 0 в каждом слоте. Я пытаюсь сложить так, например, если m [10] = {0,1,0,1,1,0,0,0,1,1}; «testOutput» будет «0101100011»

мое значение с плавающей точкой: 271459,593750 и он выплевывает: 1240481687

edit: theArr имеет числа с плавающей точкой

1 Ответ

0 голосов
/ 29 апреля 2019

Краткий ответ: вы получаете переполнение в atoi

Если ваша система имеет 32 бита int и использует представление дополнения до 2, максимальное значение, которое можно сохранить в int, равно 2147483647.Для желаемого результата ваш максимум будет 1111111111, то есть 10 цифр.Другими словами - когда объединенная строка имеет 11 (или более) цифр, atoi больше не дает ожидаемого результата.

Вставка этого отпечатка

printf("concatenated string \"%s\" gives c=%d\n", s1, c);

непосредственно перед return c;дает такой вывод:

concatenated string "10" gives c=10
concatenated string "100" gives c=100
concatenated string "1000" gives c=1000
concatenated string "10000" gives c=10000
concatenated string "100001" gives c=100001
concatenated string "1000010" gives c=1000010
concatenated string "10000100" gives c=10000100
concatenated string "100001001" gives c=100001001
concatenated string "1000010010" gives c=1000010010
concatenated string "10000100100" gives c=1410165508  // Notice the overflow !!
concatenated string "14101655080" gives c=1216753192
concatenated string "12167531921" gives c=-717369967
concatenated string "-7173699671" gives c=1416234921
concatenated string "14162349210" gives c=1277447322
concatenated string "12774473220" gives c=-110428668
concatenated string "-1104286680" gives c=-1104286680
concatenated string "-11042866801" gives c=1842035087
concatenated string "18420350871" gives c=1240481687

HERE:1240481687

Вы можете попробовать использовать long long int вместо int и использовать atoll вместо atoi.Это поможет вам сохранить некоторые дополнительные цифры.

...