2017-01-22 10 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と として日食使用しています 私は64ビットシステム上でだけど、私は私のシステムのためのMinGW-W64をインストールしようとしたMINGW32 を使用していますが、どのように見つけることができませんでした...不可欠な基本については

+2

C++は整数型のサイズをほとんど実装者に任せます[これを読んでください](http://en.cppreference.com/w/cpp/language/types#Integer_types)。 C++標準では、整数型が少なくともXビットであることのみを指定しています。すべての整数型は64ビットです。 – user4581301

+2

あなたは本当に一度に一つの質問をするべきです。 – juanchopanza

+0

C++では、 'INT_MAX'のようなCマクロの代わりに' std :: numeric_limits'を使うことができます。 –

答えて

2

int, unsignedunsigned shortunsigned longなどのC++標準では、サイズではなく、各タイプが表すことができる値を明確に規定しています。注:これは、99およびC++(2011年以降)からCに導入された「固定幅」タイプには適用されません。

実際には、intは、-32767から32767までの範囲の値を(少なくとも)サポートできることが必要です。 short int(別名short)の要件は同じです。 long intの要件は、範囲-21474836472147483647をサポートするための要件になります。

ただし、重要なことは、最小要件であり、すべての種類でより広い範囲の値をサポートできることです。ただし、これらのタイプのサイズは実装定義されています。

は実際には、バイナリ表現を仮定し、intshortの要件は、要件が32ビット以上に変換し、long、二つ8ビットのバイトに等しい符号ビットを含む16ビット以上を、必要に変換しますまたは4つの8ビット・バイト。

最新のコンパイラでは、最新のターゲットアーキテクチャがデジタルなので、バイナリ表現を使用していることに注意してください。しかし、C++標準はこれを実際には必要としません。必要な範囲(ここでは整数型の場合)や動作の制限を記述するだけです。

short16ビットであることから実装(コンパイラ)が停止することは何もないので、各整数型はより広い範囲の値を表すことができます。 32ビットであり、longビットであり、32ビットである、intである。このような値に依存する当然のコードは、16ビットshort16ビット、int、および32ビットlongのような他の実装では動作しません。

unsignedタイプについても同様の議論がありますが、範囲が異なる点が異なります。実際には、unsigned shortは、16ビット以上で表され、unsigned intは、16ビット以上であり、ビット以上であってもよい。

long doubleについてのご質問については、自由に利用できる実装の中には、long doubleのサポートにバグがあり、そのようなものが出力される場合があります。たとえば、メモリから、gnuコンパイラのMingWポートのいくつかのバージョン - Eclipseに同梱される可能性があります。コンパイラの更新があるかどうか確認してください。

サイドノート: - 明確なように、これらの型が表すことができるように要求されている範囲の副作用であることからは、私はそのようなsizeof char <= sizeof short <= sizeof int <= sizeof long <= sizeof long longような関係は、最近のCおよびC++規格で要求されている主張を見てきました。私は最近の基準が積分型を表現するために使用されるビット数の要件を設定していることを示唆するいくつかの主張も見てきました。私はそれらの主張を立証していません(そのような関係に依存するコードを書いたことはないので、理由はありません)。私はこれらの主張が実際に真実であることを知っておくべきです、私は上記の議論を更新します。

関連する問題