3
#include <iostream>
#include <bitset>

using namespace std;

int main()
{
    bool a = 0x03;
    bitset<8> x(a);
    cout<<x<<endl;

    a = a>>1;
    bitset<8> y(a);
    cout<<y<<endl; 
}

結果は次のとおりです。

00000001    
00000000

結果はそうではありません:

00000011
00000001

の型をaからboolに変更するcharと、結果は 2 番目になります。に 0x01 を超える値を格納することはできません。0x01 をbool超える値はすべて 0x01 として扱われます。

すべてのコンパイラに動作がありますか?

4

6 に答える 6

8

§4.12 ブール変換 [conv.bool]

1 算術、スコープなし列挙、ポインター、またはメンバー型へのポインターの prvalue は、bool 型の prvalue に変換できます。ゼロ値、null ポインター値、または null メンバー ポインター値は false に変換されますその他の値は true に変換されます。std::nullptr_t 型の prvalue は bool 型の prvalue に変換できます。結果の値は false です。

于 2013-06-27T03:44:30.113 に答える
5

オブジェクトに正当に格納できる値は と だけです。これらの 2 つの値のいずれかを生成する他の型からのすべての変換。オブジェクトのサイズは常に少なくとも 8 ビット (ビット フィールドでない限り) ですが、言語は意図的に他の 254 (またはそれ以上) の可能な値を格納することを困難にしています。boolfalsetrueboolbool

を使用したり、ユニオンを使用したり、ポインター変換を使用したりして、適合する他の値を格納することができますmemcpyしかし、そうすると、プログラムの動作が未定義になる可能性があります。つまり、格納された値がまたは(またはまたは) であると想定するコードをコンパイラが生成できるということです。何か他のものを保存すると、プログラムの動作は予測できなくなります。falsetrue01

boolC++ メモリ モデルはサブバイト オブジェクト (ビット フィールド以外) をうまく処理できないため、少なくとも 8 ビットです。他の 7 ビット (またはそれ以上) を使用することは想定されていません。

オブジェクトに 2 つ以上の値を格納する場合は、オブジェクトにしないでくださいbool

于 2013-06-27T04:09:46.417 に答える
4

bool a = 0x03;0x03 をブール値に変換します。ゼロでないすべての数値は true と評価されるため、どのデータを割り当てるかに関係なく、最初の結果が表示されます。

于 2013-06-27T03:41:37.520 に答える
2

C++11、§3.9.1/6:

bool 型の値は true または false です。[...]

于 2013-06-27T03:43:45.623 に答える
1

Aはとのbool2 つの値しか保持できません。falsetrue

整数コンテキストで使用する場合は、 aboolを に変換できますint。この場合、 にfalse変換され0、 にtrue変換され1ます。

a に使用されるストレージのサイズに関係なくbool(たとえば、sizeof(bool)==1とはどちらもかなり一般的です)、常にと にそれぞれ変換されるとsizeof(bool)==4の 2 つの値しか保持できません。他の値はあり得ません。falsetrue01

于 2013-06-27T03:58:57.083 に答える
0

なぜあなたはできると思いますか?と言っているようなものint i = "abc";です。

于 2013-06-27T03:41:22.100 に答える