-3
int main()
{
    uint32_t n1 = 00000000000000000000000000001000;
    uint32_t n2 = 00000000000000000000000000000100;
    cout << n2; 
}

Visual Studio 2013 (C++) を使用すると、結果が 64 になります。

これが 2 進数ではなく 8 進数に変わるのはなぜですか?

4

2 に答える 2

3

これは、先頭の数値が08 進数と見なされるためです。

auto num = 04; //Octal number

C++14 以降では、2 進数を指定する場合は、0bプレフィックスを使用する必要があります。

uint32_t n2 = 0b00000000000000000000000000000100;
              ^^

C++14 を使用できない場合は、目的の結果を得るためにビット シフトまたは同様の手法を使用する必要があります。

10 進数の場合は、先頭の sを削除する必要があります。0

于 2016-08-20T04:47:30.417 に答える
2

数値リテラルを08 進数として解釈することを意味します。これは、「8 進数」を使用したときに意味したと思われるもので、これまでに見たことのない単語であり、実際の単語のように見えますが、おそらくあなたがそれを使用する場合、いくつかの空白の凝視を得る:-)

8 進数としてのこの処理は、標準に従っていますC++11 2.14.2 Integer literals /1

8 進整数リテラル (基数 8) は数字 0 で始まり、一連の 8 進数字で構成されます。

2 進数の場合、おそらく最も簡単な方法はビット シフトを使用することです (C++14 より前):

uint32_t n1 = 1u << 3;
uint32_t n2 = 1u << 2;

C++14 は、16 進数の0bプレフィックスに似たプレフィックスを提供し0xますが、それでも多数の先行ゼロを使用する場合、他のオプションと同じくらい読みやすいとは完全には確信していません。

uint32_t n1 = 0b00000000000000000000000000001000;
uint32_t n2 = 0b00000000000000000000000000000100;

もちろん、ベテランのコーダーは、2 進数から 16 進数に即座にマップできるため、おそらく次のように使用します。

uint32_t n1 = 0x00000008;
uint32_t n2 = 0x00000004;
于 2016-08-20T04:46:52.100 に答える