2017-05-25 100 views
0

我有一些非常简单的代码,从ADS传感器读取,它返回值为int16_t。我知道这个值总是正面的,所以它可以节省内存。我将它存储在uint8_t的数组中。但是,我正在得到一个非常奇怪的转换 - 任何想法?Arduino 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 

赫克我错过了什么?

回答

4

uint8_t是一个无符号的8位整数。它可以表示0到255之间的值。 int16_t是一个带符号的16位整数。它可以表示-32768到32767之间的值。请参阅this link以获取到达整型可以表示的值列表。

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

+0

谢谢你指出我的骨头错误......我只是在想,uint8_t更大...... dope – DaKaZ

+1

的确,因为你只使用'int16_t'的正值,你应该能够节省内存,因为有一半的可能状态未被使用。错误是假设一半状态意味着一半位。每个比特使整数可以具有的状态数量加倍,浪费是1比特。你需要某种无符号的15位整数来恢复浪费的内存。 –

+1

@FrançoisAndrieux--当然,这就是这并不能真正保存任何记忆的原因;摆脱一点不会影响使用的存储量。 –