Я использую библиотеку math.h, и когда я запускаю приведенный ниже код, я получаю ошибки компиляции g ++, говорящие мне «предупреждение: переполнение при неявном преобразовании констант» для нескольких строк. Однако, если я все равно запускаю исполняемый файл, он дает мне разумные числа (хотя по некоторым причинам максимумы Ints и long возвращают то же самое). Но если я использую библиотеку cmath, все типы данных со знаком дают мне отрицательные значения, а unsigned all возвращает 0 ….
C ++:
/* Calculating data type sizes directly */
/* Shorts - 2 bytes = 2*8(bits/byte) = 16 bits */
smallest_short = -(pow(2, 15));
largest_short = pow(2,15); // LINE 141
us_smallest_short = 0;
us_largest_short = pow(2, 16); // LINE 143
/* Ints - 4 bytes = 4*8(bits/byte) = 32 bits */
smallest_int = -(pow(2, 31));
largest_int = pow(2, 31); // LINE 147
us_smallest_int = 0
us_largest_int = pow(2, 32); // LINE 149
/* Long - 8 bytes = 8*8(bits/byte) = 64 bits */
smallest_long = -(pow(2, 63));
largest_long = pow(2, 63); // LINE 153
us_smallest_long = 0;
us_largest_long = pow(2, 64); // LINE 155
Ошибки компиляции g ++:
datatypesexp.cpp: In function âint main()â:
datatypesexp.cpp:141: warning: overflow in implicit constant conversion
datatypesexp.cpp:143: warning: overflow in implicit constant conversion
datatypesexp.cpp:147: warning: overflow in implicit constant conversion
datatypesexp.cpp:149: warning: overflow in implicit constant conversion
datatypesexp.cpp:153: warning: overflow in implicit constant conversion
datatypesexp.cpp:155: warning: overflow in implicit constant conversion
Должен ли я придерживаться math.h? Как мне разрешить предупреждения?
Также,
если я запускаю exec с math.h, игнорируя предупреждения, мои подписанные «large int» и «long long» оба возвращают 2147483647.
В то время как без знака они оба возвращают 4294967295. Но longs должен возвращать большую ценность …
Как я мог исправить это?
Положительные значения переполняются, потому что на той стороне шкалы есть ноль для размещения, оставляя вас на одно значение меньше. Например, pow(2, 31)
равен 2 147 483 648 (представлен перед присваиванием как двойной), но наибольшее целое число со знаком в этом случае составляет 2 147 483 647.
Наибольшее значение, которое может содержать n-битная переменная без знака, равно 2 ^ n-1, а не 2 ^ n.