2013-04-23 18 views
0

У меня вопрос о количестве байтов, которые компьютер обычно использует для расчета. Прежде всего, я хочу, чтобы вы увидели исходный код ниже.Верхняя граница вычислительной способности компьютера в c

исходный код

printf("%d\n", sizeof(444444444)); 
printf("%d\n", 444444444); 

printf("%d\n", sizeof(4444444444)); 
printf("%llu\n", 4444444444); 

выход

4 
444444444 
8 
4444444444 

Как вы можете видеть, что компьютер никогда не теряет значение. Если бы он был слишком большим, чтобы вписаться в int, сам компьютер автоматически расширил бы его тип. Я думаю, причина, по которой компьютер никогда не теряет значение, состоит в том, что он работает первоначально на большом типе, который уже по крайней мере больше, чем 8-битный контейнер.

Ребята, дайте мне знать общий механизм? Благодарим вас за помощь.

+0

При использовании числовой литерал, компилятор автоматически выбирает соответствующие данные тип, в который это значение будет соответствовать. Что именно вы хотите знать? –

+0

@CodyGray Вы хотите сказать мне, что даже если бы я не вводил суффикс сразу после числа, компилятор автоматически добавит соответствующий суффикс? Извините за раздражение. Но я просто хочу точно знать, что там происходит. Это конкретно указано в c99? – isbae93

ответ

2

Это не имеет никакого отношения к «вычислительной способности компьютера».

Ваш пример - это размер целочисленного литерала, с которым вы имеете дело, на этапе компиляции. A int на большинство платформ - это четыре байта (32 бит). Это имеет максимальное значение 0x7FFF_FFFF или 2147483647. unsigned int имеет максимум 0xFFFF_FFFF или 4294967295.

Компилятор обычно по умолчанию int для большинства целочисленных литералов, (как в примере 4 байта). Следующее значение - 0x1_08e8_d71c, которое слишком велико для int, поэтому литерал продвигается до 8-байтового литерала, long long.

Это, вероятно, предупреждение для большинства компиляторов.

НКУ (в 32-битном режиме, -m32) дает следующее предупреждение, потому что long всего 4 байта:

предупреждение: целочисленная константа слишком велика для 'длинного' типа

Выход

sizeof(int)=4, sizeof(long)=4, sizeof(long long)=8

В 64-битном режиме (-m64) GCC классный, потому что long - это 8-байтовый.

sizeof(int)=4, sizeof(long)=8, sizeof(long long)=8

Чтобы исправить это, вы должны использовать LL суффикс:

long long val = 4444444444LL; 
+0

Благодарим вас за ответ. Это указано в стандарте c99? – isbae93

+2

Я уверен, что это так, я просто не уверен в своей голове. Я уверен, что один из тех сумасшедших парней стандартов придет и превзойдет меня :-) –

+0

Каков предел продвижения? Возможно ли, чтобы компьютер мог продвигать число до 16 байт, 32 байт, 64 байта? Хотя я знаю, что это смешно, потому что правильные типы для 16byte или что-то подобное в настоящее время не найдены. Я просто хочу знать эту возможность. – isbae93

Смежные вопросы