unsigned long longは何バイトですか?


84

何バイトunsigned long longですか?と同じunsigned long long intですか?


52
sizeof(unsigned long long)を実行します。
共産党のアヒル


2
CおよびC ++標準では、コンパイラーが自動的に選択する方法をオーバーライドするために、数字が含まれているものを採用する必要があります。float32、float64、int32など、必要な制限までの何か、int256またはfloat1024はどうですか?...これは本当に痛みを取り除きます...
jokoon 2011

2
@gokoon:私は私の答えで説明したように、Cの標準はすでに持っているint32_tuint64_tなどのC ++の今後の標準とそれらを受け取ることになります。それらはヘッダーにあり<stdint.h>ます。
Fred Foo

1
フロートとダブルはどうですか?
jokoon 2011年

回答:


82

エグゼクティブサマリー:64ビット以上です。

unsigned long longと同じunsigned long long intです。そのサイズはプラットフォームに依存しますが、C標準(ISO C99)によって少なくとも64ビットであることが保証されています。long longC89にはありませんでしたが、どうやらMSVCでさえサポートしているので、かなり移植性があります。

現在のC ++標準(2003年に発行)にはありませんlong longが、多くのコンパイラが拡張機能としてサポートしています。今後のC ++ 0x標準はそれをサポートし、そのサイズはCと同じになるため、少なくとも64ビットになります。

式を使用して、正確なサイズをバイト単位(通常のプラットフォームでは8ビット)で取得できますsizeof(unsigned long long)。正確に64ビットが必要な場合uint64_tは、ヘッダーで定義されているを使用します。これは<stdint.h>、関連する一連の型(C99、C ++ 11、および一部の現在のC ++コンパイラで使用可能)とともに定義されています。


2
@lars: sizeof(char) 正確に1つを返すことが保証されています。「charunits」の数ではなく、オペランドの大きさをバイト数で返します。したがって、「ほとんどのプラットフォーム」のバイトではなく、すべてのプラットフォームのバイトです。
John Dibling 2011

1
@John:バイトの定義に依存します。あなたが同等charでバイトすれば、あなたは正しいです。等式charオクテットの場合、それは変化します。
Fred Foo

4
@lars:いいえ、違います。文字は、すべてのプラットフォームで常に正確に1バイトです。標準では、1バイトに含まれるビット数は指定されていませんが、それは別のことです。実装では64ビットバイトを使用できます。これにより、結果sizeof(long long) == 1が適合します。
John Dibling 2011

1
@lars:とにかく私はすでにあなたに賛成しましたが、ここにちょっとした問題があります:「C標準(ISO C99)によって少なくとも64ビット== 8バイトであることが保証されています」64ビットの非埋め込みの世界を想像することはできません! = 8バイトですが、標準では保証されていません。
John Dibling 2011

@ジョン:もう一度。私はすでに言語弁護士モードになっているので、64ビット== 8バイトを削除しました。実際、1バイトが16ビットの組み込みプラットフォームがあると聞きました。
Fred Foo

17

Cと同様に、C ++の利点は、これらのサイズが実装によって定義されることです。したがって、使用しているコンパイラーを指定しないと、正しい答えはありません。それらの2つは同じですか?はい。「longlong」は、両方を受け入れるコンパイラの「longlongint」の同義語です。


2
あなたの言うことは技術的には真実ですが、標準ではlong longは少なくとも64ビット長である必要があり、64ビット以外のサイズを定義する実装を私は知りません。128ビットコンパイラが出たときにそれは変わるかもしれませんが、現在のコンパイラでは64ビットを想定するのは簡単ではありません。
Boaz Yaniv 2011

2
+1、反対票に対抗する。答えは「is」の意味によって異なります。
アンディフィンケン

3
@アンディ:ビル・クリントン?あなたなの?;)
John Dibling 2011

4
これは絶対に「C ++の美しさ」ではなく、完全な苦痛です:p
asimes 2015年

@MichaelBurr 8年後、私はまだ自分の人生で何をしているのか疑問に思っています。少なくとも、Rustが強制型サイズで何をするのかを、少なくともコンパイル時のリテラル。まだそのような運はありません。このようなことは純粋な苦痛に他なりません。
Sahsahae

15

少なくとも64ビットである必要があります。それ以外は、実装が定義されています。

厳密に言えば、unsigned long longC ++ 0x標準になるまでC ++の標準ではありません。 unsigned long longタイプの「simple-type-specifier」unsigned long long intです(したがって、これらは同義語です)。

ザ・ long long型セットもC99にあり、標準化される前からC ++コンパイラの一般的な拡張機能でした。


1
「最近批准された?」私は、彼らが2012年にそれを延期検討していたがチェック最後の時間
フレッド・フー


1
@インシリコ:私はそれを読んだ。遅れの可能性についてもどこかで読んだのですが、正直どこか思い出せません。
フレッドフー

1
@larsmans:FDISの遅延に関する公式ソースが表示されない限り(「C ++ 0xFDIS遅延」の検索エンジンクエリでは関連するヒットはありません)、2011年に標準が公開されることを完全に期待しています。それにもかかわらず、標準自体。
インシリコ2011年

1
@In silico:参照も見つからなかったので、それは私の側の噂か誤解のどちらかだったと思います。それでも、FDISのステータスは完全な批准と同じではないと思いますね。
フレッドフー

3

演算子を使用すると、sizeofバイトで表された型のサイズがわかります。1バイトは8ビットです。次のプログラムを参照してください。

#include <iostream>

int main(int,char**)
{
 std::cout << "unsigned long long " << sizeof(unsigned long long) << "\n";
 std::cout << "unsigned long long int " << sizeof(unsigned long long int) << "\n";
 return 0;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.