我有一些非常简单的代码,它从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
我错过了什么?
答案 0 :(得分:4)
uint8_t
是无符号的8位整数。它可以表示0到255之间的值。
int16_t
是带符号的16位整数。它可以表示-32768到32767之间的值。有关达到整数类型可以表示的值列表,请参阅this link。
当你转换你的值((uint8_t)ads0;
)时,你试图将790的数值转换成一个只能表示最多255个值的类型。这会导致数据丢失。