Почему int может содержать 10-значный номер, но не может обрабатывать 9-значный другого целого числа? - PullRequest
0 голосов
/ 10 февраля 2019

Возможно, на этот вопрос уже был дан ответ, и я не совсем уверен, как это сформулировать, но здесь ничего не говорится.Я компилирую, используя gcc в Linux.Мой вопрос заключается в том, почему компилятор выдаст предупреждение о переполнении, когда я назначу десять 9 переменных int, но не при назначении значения «1234567891», в котором используются десять цифр.Это произойдет, если я назначу значение «12345678912».

#include <stdio.h>

int main(void)
{
    int a = 1234567891;
    int b = 9999999999;

    printf("%d, %d\n", a, b);

    return 0;
}

test.c: 6: 11: предупреждение: переполнение при преобразовании из long int в int изменяет значение с 9999999999'to' 1410065407 '[-Woverflow] int b = 9999999999;

test.c: 6: 11: предупреждение: переполнение при преобразовании из' long int 'в' int 'изменяет значение с' 12345678912 'на'-539222976 '[-Woverflow] int b = 12345678912;

Вывод только десяти целых чисел:

~ / Программирование $ ./a.out 1234567891

1 Ответ

0 голосов
/ 10 февраля 2019

Это не имеет ничего общего с количеством «мест» в базе 10 или, если вы предпочитаете, длиной числа, когда вы его записываете (опять же, в базе 10).Самая основная причина ограничения состоит в том, что компьютеры хранят числа (и все остальное) в виде битов и байтов, что означает, что они работают в базе 2.

int в c - это 4-байтовый (32-разрядный) тип данных.Он может хранить числа в диапазоне от -2 147 483 648 (-2 31 ) до 2 147 483 647 (2 31 - 1), если подпись int или от 0 до 4 294 967 295 (2 )32 -1), если это не так.

В любом случае, 1234567891 находится в диапазоне, который вписывается в 4 байта, но 9999999999 и 12345678912 - нет.


Примечание:Я признаю, что спецификация допускает, чтобы int составлял 2 байта, но описанное OP поведение возможно, только если OP использует реализацию, в которой int равен 4 байта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...