2012-01-10 3 views
5

В C на 32-разрядной системе, какой тип данных будет хранить (и может поэтому печатать) наибольшее целое число? Это long long или unsigned long? Есть unsigned long long? И что является наиболее точным и политически правильным?Каков максимальный тип данных для хранения (и печати) целого числа?

+4

Если вы просто обеспокоены возможностью отображения больших числа, я бы проголосовал за char *. :) –

+2

Возможно, вы задаете неправильный вопрос. * Как высока вам нужно идти? * – Jon

+1

Да, C99 поддерживает примитивный тип 'unsigned long long', но C90 этого не делает. А поскольку множество компиляторов C в дикой природе все еще C90, ответ может быть отрицательным. На кого вы работаете/заинтересованы? –

ответ

10

Ваш вопрос немного неясен, но intmax_t является самым большим знаковым целочисленным типом (и uintmax_t - это самый большой целочисленный тип без знака). Это typedefs, определенные в <stdint.h>, но если вы их печатаете, вам нужно вместо <inttypes.h>, а макросы PRInMAX для различных значений n.

+5

И 'uintmax_t' (если реализация поддерживает их, они были добавлены в C99). –

+0

dont '% jd' и'% ju' работают (и выглядят лучше) для печати 'intmax_t' и' uintmax_t' respectivelly? Источник: - [последний свободный доступный проект c11] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf), см. Раздел 7.21.6.1 на 'fprintf' –

1

В ISO C99 long long не менее 64 бит, который является самым большим стандартным типом данных. Он также приходит как unsigned long long. Очевидно, ваш компилятор может предоставить более крупные типы, определенные intmax_t и uintmax_t.

Однако на основе ваших комментариев вы можете искать библиотеку bigint, такую ​​как GMP. Он позволяет произвольным длинным целым (и с плавающей запятой) ограничить длину только вашими системными ресурсами.

+4

Да (обратите внимание, что 'long long' и' unsigned long long '- это разные типы), но реализации могут иметь * расширенные целые типы *, которые шире, чем 'long long'. Параметры typedefs 'intmax_t' и' uintmax_t', определенные в '' и' ', соответствуют самым большим типам с подписью и без знака, соответственно, являются ли они расширенными типами или нет. –

+0

@KeithThompson Спасибо, что я включил это. – ChrisWue

0

Тип данных с самой длинной печатной строкой представляет собой подписанный тип данных, если только у вас нет целочисленного типа с максимальным значением без знака, которое на одну цифру длиннее максимального значащего знака.

Например, 4-разрядное целое без знака будет иметь не более двух символов без знака или один символ плюс отрицательный знак при подписании.

Итак, вы должны выбрать тип подписанных данных для представления самой большой печатной строки. Который должен быть long long.

+0

самая длинная печатная строка для 'int64_t' и' uint64_t' - '-9223372036854775808' и' 18446744073709551615' соответственно, которые имеют одинаковую длину. –

2

Без избиения вокруг куста я бы хотел сказать, что иногда не в реальной практике кодирования bt да defintly в некоторых соревнованиях может потребоваться очень большие типы данных. Bt Я думаю, мы сможем это сделать. Почему бы не взять на себя всю последовательность в виде строки, а затем использовать функцию atoi, чтобы получить целое значение, это я думаю politcally правильно :: :)

#include<stdio.h> 
#include<stdlib.h> 

int main() 
{ 
    int i; 
    char bigString [256]; 

    printf ("Enter a number: "); 
    fgets (bigString, 256, stdin); 

    i = atoi (bigString); 
    printf ("The value entered is %d.",i); 

    return 0; 
} 
+5

Вам все равно нужно сохранить преобразованное значение в целое число, которое все еще вызывает переполнение. – Sinstein