2017-01-22 6 views
-1

Я только начинаю изучать код (например, 3 дня назад) И у меня есть несколько проблем ... Во-первых, мои «int», «long int» и «unsigned int» Все выглядят одинаково ,C++ long int то же, что и int?

#include <iostream> 
#include <limits.h> 
using namespace std; 

int main() { 

    int value = 2147483647; 
    cout << value << endl; 

    cout << "Max int value: "<< INT_MAX << endl; 
    cout << "Min int value: "<< INT_MIN << endl; 
    long lvalue = 568534534; 
    cout << lvalue << endl; 

    short svalue = 22344; 
    cout << svalue << endl; 

    cout << "Size of int " << sizeof(int) << endl; 
    cout << "Size of short int: " << sizeof(short) << endl; 
    cout << "Size of long int: " << sizeof(long) << endl; 
    cout << "Size of unsigned int: " << sizeof(unsigned int) << endl; 
    unsigned int uvalue = 5345554; 
    cout << uvalue << endl; 
return 0; 
} 

И когда я запускаю его, я получаю это:

568534534 
22344 
Size of int 4 
Size of short int: 2 
Size of long int: 4 
Size of unsigned int: 4 
5345554 

Как вы можете видеть. Long и unsigned int = int.

Это не моя единственная проблема. С «длинным двойником», независимо от того, насколько велика цифра, она ВСЕГДА выводит отрицательный результат. Вот код:

#include <iostream> 
#include <iomanip> 

using namespace std; 

int main() { 

    float fvalue = 123.456789; 

    cout << sizeof(float) << endl; 
    cout << setprecision(20) << fixed << fvalue << endl; 

    double dvalue = 234.5554; 
    cout << setprecision(20) << fixed << dvalue << endl; 

    long double lvalue = 123.4; 
    cout << setprecision(20) << fixed << lvalue << endl; 
    return 0; 
} 

Вот результат:

4 
123.45678710937500000000 
234.55539999999999000000 
-18137553330312606000000000000000000000000000000000000 

(Удалено большинство нулей кстати)

Итак, как вы можете видеть, что есть проблемы с чем-то. Я использую затмение как мой IDLE и я использую Mingw32 Хотя я на 64 битной системе, я попытался установить MinGW-w64 для моей системы, но не смогли выяснить, как ...

+2

C++ оставляет размер целочисленных типов в значительной степени до разработчиков. [Дайте это прочитать] (http://en.cppreference.com/w/cpp/language/types#Integer_types). Обратите внимание, что стандарт C++ указывает только на то, что целые типы должны быть не менее X бит. Все ваши целые типы могут быть 64 бита. – user4581301

+2

Вы должны задать один вопрос одновременно. – juanchopanza

+0

Обратите внимание, что в C++ вы можете использовать 'std :: numeric_limits' вместо тех макросов C, что и' INT_MAX'. –

ответ

2

Для основной интеграл типы (например, int, long int, unsigned, unsigned short, unsigned long) стандарты C++ формулируют требования к тому, какие значения могут представлять каждый тип, а не размер. Примечание. Это не относится к типам «фиксированной ширины», введенным в C от 99 и C++ (с 2011 года).

Практически int требуется для поддержки (не менее) всех значений в диапазоне -32767 до 32767. Требования к short int (aka short) являются одинаковыми. Требования к long int соответствуют требованию поддерживать диапазон -2147483647 до 2147483647.

Однако, что важно, это минимальные требования - всем таким типам разрешено поддерживать более широкий диапазон значений. Однако размеры этих типов определяются реализацией.

Практически, предполагая бинарное представление, требование к int и short перевести нуждаясь 16 бита или больше, в том числе знаковых бит, что соответствует два 8 -битовым байтам, для long, требование приводит к 32 битам или более, или четыре байта 8.

Обратите внимание, что большинство современных компиляторов используют двоичное представление (поскольку современные целевые архитектуры являются цифровыми). Однако стандарт C++ на самом деле не требует этого - он просто формулирует требуемые диапазоны (как это имеет место здесь, для интегральных типов) или ограничения на поведение.

Однако каждому интегральному типу разрешено представлять больший диапазон значений (т. Е. Превышать минимальные требования, предъявляемые к стандартным состояниям), поэтому нет ничего, что могло бы остановить реализацию (компилятор) от short, то есть 16 бит, int, то есть 32 бит, а также long, а также 32 бит.Естественно, что код, основанный на таких значениях, не гарантирует работу с другими реализациями - например, с 16 -битом short, a 16 -bit int и 32 -bit long.

Такое же обсуждение может быть выполнено для типов unsigned, за исключением того, что диапазоны отличаются. Однако фактически, unsigned short может быть представлено с использованием 16 бит или более, unsigned int также может быть 16 бит или более, а unsigned long - 32 бит или более.

Что касается вашего вопроса о long double - некоторые свободно доступные реализации имеют ошибки в своей поддержке long double, которые вызывают выход, как вы описываете. Из памяти, например, некоторые версии MingW-портов компиляторов gnu, которые, скорее всего, будут отправлены с Eclipse. Проверьте, есть ли обновление для вашего компилятора.

Side Примечание: Я видел заявления, что отношения, такие как sizeof char <= sizeof short <= sizeof int <= sizeof long <= sizeof long long требуются последними стандартами С и С ++ - в отличие от того, чтобы быть побочным эффектом диапазонов этих типов требуется, чтобы быть в состоянии представить. Я также видел некоторые утверждения о том, что последние стандарты устанавливают требования к числу бит, используемых для представления интегральных типов. Я не обосновал эти претензии (нет причин, так как я никогда не пишу код, который полагается на такие отношения). Должен ли я узнать, что эти утверждения действительно верны, я расскажу об этом выше.

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

  • Нет связанных вопросов^_^