Пример 2.1, K & amp; R: Неверное значение символических констант для LONG_MIN и LONG_MAX?

Это код, который я использую, чтобы найти символические значения констант для LONG

   #include <limits.h>     //These header files contains the symbolic constants
#include <float.h>      //for different datatypes

#include <stdio.h>

int main(void){

printf("\tMininum numeric value for long type: %ld\n", LONG_MIN);
printf("\tMaximum numeric value for long type: %ld\n", LONG_MAX);

printf("\tMaximum numeric value for unsigned long type: %lu\n", (unsigned)ULONG_MAX);
return 0;
}

Вывод, который я получаю:

  Mininum numeric value for long type: -9223372036854775808
Maximum numeric value for long type: 9223372036854775807
Maximum numeric value for unsigned long type: 4294967295

Но если посмотреть на limit.h со страницы руководства. Это символические константы для LONG_MIN, LONG_MAX, LLONG_MIN а также LLONG_MAX от limits.h файл в моей системе.

  {LONG_MIN}
Minimum value of type long.
Maximum Acceptable Value: -2 147 483 647

{LONG_MAX}
Maximum value of a long.
Minimum Acceptable Value: +2 147 483 647

{LLONG_MIN}
Minimum value of type long long.
Maximum Acceptable Value: -9223372036854775807

{LLONG_MAX}
Maximum value of type long long.
Minimum Acceptable Value: +9223372036854775807

Как будто программа выдаёт мне значения длинных символьных констант.

Почему это происходит?

0

Решение

Размеры типов являются переменными. long является по крайней мере 32 бита (что дает диапазон + -2 миллиарда), но он может быть больше. В 64-битной системе это может быть, например, 64-битная.

long long должно быть не менее 64 бит, но, конечно, может быть больше.

Эти размеры зависят от базовой аппаратной платформы а также компилятор. Например, в 64-битной системе Windows, использующей GCC, long 64 бит, но с использованием компилятора Visual C ++ long «только» 32 бита.

Узнайте больше о целочисленные типы в этой ссылке.

2

Другие решения

очевидно long 64 бит в вашей системе.

Стандарт C определяет минимальные пределы для целочисленных типов. Это означает, что, например, LONG_MAX должен быть по крайней мере 2 147 483 647, но это может быть больше.

Как примечание, это ошибка: (unsigned)ULONG_MAX, Должен быть без знака долго.


Одна интересная любопытная вещь: обратите внимание, например, что LONG_MIN должен быть как минимум -2 147 483 647, Но даже в обычной 32-битной системе с двумя комплементами это никогда не имеет такого значения!
Имеет значение -2 147 483 648, Это сделано намеренно, чтобы позволить кому-то дополнить и подписать & системы величин.

2

Это то, что он говорит.

Minimum Acceptable Value: +2 147 483 647

«Минимально приемлемое значение» для LONG_MAX в том, что. Ваша ценность для LONG_MAX (потому что ваша система 64-битная) выше.

Так что проблем нет.

0
По вопросам рекламы [email protected]