0

以下のコードでこれらの結果が得られるのはなぜですか?

void loop() {
    byte test = 00000101;
    Serial.print("The byte test is: ");
    Serial.println(test);
    int x = (int)test;
    int y = (int)test<<8;
    Serial.print("The int x is: ");
    Serial.println(x);
    Serial.print("The int shifted y is: ");
    Serial.println(y);

    byte tost = 10000001;
    int z = test + tost;
    Serial.print("The int z is: ");
    Serial.println(z);

    delay(1000);
}

結果

バイトテストは: 65

int x は: 65

int シフトされた y は次のとおりです: 16640

int z は: 194

テストを 00000001 に変更すると、素晴らしいパフォーマンスが得られます。

変更されたコード:

void loop() {
    byte test = 00000001;
    Serial.print("The byte test is: ");
    Serial.println(test);
    int x = (int)test;
    int y = (int)test<<8;
    Serial.print("The int x is: ");
    Serial.println(x);
    Serial.print("The int shifted y is: ");
    Serial.println(y);

    byte tost = 10000001;
    int z = test + tost;
    Serial.print("The int z is: ");
    Serial.println(z);

    delay(1000);
}

結果:

The byte test is: 1

The int x is: 1

The int shifted y is: 256

The int z is: 130

私の問題は、加速度計のデータ レジスタから読み取りたい 2 バイトがあることです。値は2 の補数wire.readで格納されるため、シフトを行う必要があるため、値を破棄すると符号付きと符号なしのバイトが返されるので、チェックしたいと思いました。

だから私はバイトを持っているかどうかを確認したかったので、それをシフトしてintに保存しようとしました.どのような値が得られますか.

4

2 に答える 2

3

1 と 0 が多く、幅が 8 桁であるため、「2 進数に見える」数値を書いたからといって、それが魔法のように 2 進数リテラルになるわけではありません。どのように期待しますか:

byte x = 100;

byte x = 100;

値が 100 10 (100 または 100 2 (4)) であることを知るには?

0実際、C (および C++) には組み込みのバイナリリテラルさえありません。

于 2013-04-10T10:08:14.013 に答える
2

Alexy Frunze が 0 で始まる数値は octal であると述べたため、上記の答えは正しいです。

000000101 is 65 not 5
65 << 8 =16640
10000001 in decimal is 129
129+65 = 194
于 2013-04-10T10:17:41.607 に答える