Программирование на C - проблема с переполнением unsigned int - PullRequest
0 голосов
/ 11 марта 2019

Я хочу распечатать переменную целого типа со значением 3000000000;

Итак, я написал приведенный ниже код и запустил его, но напечатанное значение было неверным. Я думаю, что переменная переполнена. Но я не знаю почему.

#include<stdio.h>

int main(void) {
    unsigned int num1 = 3000000000;

    printf("%d", num1);
}

Насколько я знаю, максимальное значение переменной целого типа без знака равно (2 ^ 32-1 = 4 294 967 296 - 1) , когда код соответствует Win32 API. Но напечатанное значение равно -1294967296.

Понятия не имею, почему в моем коде происходит переполнение.

Если кто-то знает причину, пожалуйста, дайте мне знать:)

С уважением,

  • Я использую Microsoft Visual Studio 2015 Professional.

1 Ответ

1 голос
/ 11 марта 2019

использовать %u не %d

Для printf:

%d используется:

d, i Аргумент int преобразуется в десятичную запись со знаком. Точность, если таковая имеется, дает минимальное количество цифр, которые должен появиться; если преобразованное значение требует меньше цифр, оно дополняется слева нулями. Точность по умолчанию равна 1. Когда 0 печатается с явной точностью 0, вывод пустой.

%u используется:

о, у, х, х Аргумент unsigned int преобразуется в восьмеричное число без знака (o), десятичное без знака (u) или шестнадцатеричное без знака (x и X) нота- Тион. Буквы abcdef используются для преобразования x; лет Термины ABCDEF используются для X-преобразований. Точность, если любой, дает минимальное количество цифр, которые должны появиться; если преобразованное значение требует меньше цифр, оно дополняется осталось с нулями. Точность по умолчанию равна 1. Когда 0 печатается с явной точностью 0, вывод пустой.

см. http://man7.org/linux/man-pages/man3/printf.3.html

...