C++ Arduino int16到uint8的转换古怪

C++ Arduino int16到uint8的转换古怪,c++,arduino,arduino-esp8266,C++,Arduino,Arduino Esp8266,我有一些从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_AD

我有一些从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\u t
是一个无符号8位整数。它可以表示0到255之间的值。
int16\u t
是一个有符号的16位整数。它可以表示从-32768到32767的值。有关达到整数类型可以表示的值的列表,请参阅


当您转换值时(使用
(uint8_t)ads0;
),您试图将790顺序的值转换为最多只能表示255个值的类型。这会导致数据丢失。

uint8\u t
是一个无符号8位整数。它可以表示0到255之间的值。
int16\u t
是一个有符号的16位整数。它可以表示从-32768到32767的值。有关达到整数类型可以表示的值的列表,请参阅


当您转换值时(使用
(uint8_t)ads0;
),您试图将790顺序的值转换为最多只能表示255个值的类型。这会导致数据丢失。

谢谢你指出我的愚蠢错误。。。我只是觉得uint8_t更大。。。dopeIt是真的,因为您只使用
int16\t
的正值,所以您应该能够节省内存,因为一半的可能状态是未使用的。错误在于假设一半的状态意味着一半的位。每一位使一个整数的状态数加倍,浪费为1位。你需要某种无符号的15位整数来恢复浪费的内存。@FrançoisAndrieux-当然,这就是它不能真正节省内存的原因;去掉一点不会影响存储量。谢谢你指出我的错误。。。我只是觉得uint8_t更大。。。dopeIt是真的,因为您只使用
int16\t
的正值,所以您应该能够节省内存,因为一半的可能状态是未使用的。错误在于假设一半的状态意味着一半的位。每一位使一个整数的状态数加倍,浪费为1位。你需要某种无符号的15位整数来恢复浪费的内存。@FrançoisAndrieux-当然,这就是它不能真正节省内存的原因;去掉一个位不会影响所使用的存储量。