﻿# V6130\. Integer overflow in arithmetic expression\.

Анализатор обнаружил арифметическую операцию, в результате которой возможно переполнение целочисленного числа\.

Рассмотрим пример:

```cpp
private static long parseHumanLong(String str) {
    char tail = str.charAt(str.length() - 1);
    long base = 1;
    switch (tail) {
        case 't':
            base *= 1000 * 1000 * 1000 * 1000;
            break;
        case 'b':
            base *= 1000 * 1000 * 1000;
            break;
        case 'm':
            base *= 1000 * 1000;
            break;
        case 'k':
            base *= 1000;
            break;
        default:
    }
    if (base != 1) {
        str = str.substring(0, str.length() - 1);
    }
    return Long.parseLong(str) * base;
}
```

Данный метод считывает числа и переводит окончания чисел в:

* `t` — триллион;
* `b` — миллиард;
* `m` — миллион;
* `k` — тысяча\.

Ожидается, что если в метод придёт строка `1m`, то она преобразуется в переменную формата `long` со значением `1_000_000`\.

При расчёте триллионов в выражении `1000 * 1000 * 1000 * 1000` происходит переполнение, так как умножение выполняется в пределах `int`, а итоговое число превышает максимальное значение для типа `int`\. Это приводит к неверному результату\.

Чтобы вычисление было корректным, нужно явно указать выражению тип `Long`:

```cpp
base *= 1000L * 1000 * 1000 * 1000;
```