1. ホーム
  2. c++

[解決済み] Arduinoのint16_tからuint8_tへの変換のおかしさ

2022-02-17 16:05:34

質問

ADSセンサーの値を読み取る簡単なコードがあるのですが、そのコードは次のような値を返します。 int16_t . この値は常に正であることが分かっているので、メモリを節約することができます。の配列に保存しています。 uint8_t . しかし、私は本当に奇妙な変換を取得しています - 任意のアイデア?

以下はそのコードです。

int16_t ads0 = ads.readADC_SingleEnded(0);
int16_t ads1 = ads.readADC_SingleEnded(1);
PLUG_ADS[0][PLUG_ADS_IDX] = (uint8_t)ads0;
PLUG_ADS[1][PLUG_ADS_IDX] = (uint8_t)ads1;
Serial.print("ADS 0: ");
Serial.print(ads0);
Serial.print(" / ");
Serial.print(PLUG_ADS[0][PLUG_ADS_IDX]);
Serial.print(" ADS 1: ");
Serial.print(ads1);
Serial.print(" / ");
Serial.println(PLUG_ADS[1][PLUG_ADS_IDX]);

そして、その出力がこちらです。

ADS 0: 791 / 23 ADS 1: 845 / 77
ADS 0: 792 / 24 ADS 1: 844 / 76
ADS 0: 794 / 26 ADS 1: 843 / 75
ADS 0: 790 / 22 ADS 1: 843 / 75
ADS 0: 792 / 24 ADS 1: 844 / 76
ADS 0: 793 / 25 ADS 1: 843 / 75
ADS 0: 794 / 26 ADS 1: 843 / 75
ADS 0: 791 / 23 ADS 1: 844 / 76
ADS 0: 790 / 22 ADS 1: 844 / 76
ADS 0: 793 / 25 ADS 1: 845 / 77
ADS 0: 791 / 23 ADS 1: 843 / 75
ADS 0: 792 / 24 ADS 1: 843 / 75
ADS 0: 791 / 23 ADS 1: 844 / 76
ADS 0: 792 / 24 ADS 1: 844 / 76
ADS 0: 791 / 23 ADS 1: 844 / 76
ADS 0: 792 / 24 ADS 1: 844 / 76
ADS 0: 794 / 26 ADS 1: 846 / 78
ADS 0: 793 / 25 ADS 1: 842 / 74
ADS 0: 793 / 25 ADS 1: 844 / 76
ADS 0: 793 / 25 ADS 1: 845 / 77
ADS 0: 793 / 25 ADS 1: 845 / 77
ADS 0: 793 / 25 ADS 1: 844 / 76
ADS 0: 797 / 29 ADS 1: 847 / 79
ADS 0: 792 / 24 ADS 1: 843 / 75

一体何が足りないんだろう?

解決方法は?

uint8_t は符号なし8ビット整数です。0から255までの値を表現することができます。 int16_t は符号付き16ビット整数です。32768から32767までの値を表すことができる。参照 このリンク は,整数型が表現できる値の一覧です。

値を変換するときに ( (uint8_t)ads0; ) は、790 のオーダーの値を、255 までの値しか表現できない型に変換しようとしています。そのため、データの損失が発生します。