刚刚接触STM8,使用的环境是IAR For STM8 V1.301。 里面定义了一个unsigned long的变量,实际运行的时候发现数据类型是16位的,造成溢出。 unsigned int,unsigned long long,unsigned long,发现都是16位的,这个怎么破? 在选项里面各种尝试都试过,没有解决问题。 额,对于STM8来说,我是个小菜鸟。不过单片机这玩意儿我已经玩了10多年了,虽然不是专职的。 51,PIC,MSP430都用的挺多的,STM32也用过。 按照我的理解,unsigned long就是32位整数。但是为啥这里死活就是只得16位数捏。。。。。。。。 |
评分
查看全部评分
这个事情也颠覆了我的认识。
unsigned long Voltage;
Voltage = ADCData * 330;
在ADCData为838的时候,算出来的值应该是276540,但是监控发现算出来是14396。
276540 = 0x4383C
14396 = 0x383C。
也就是说,我只得到16位数。
long long显示是有点问题,其它的都可以
评分
查看全部评分
不管是16位编译器tc还是32位编译器vc都是4个字节。 int在14位编译器下是2,32位编译器下是4
评分
查看全部评分
仿真发现:
sizeof(unsigned long)等于4
sizeof(unsigned long long int)则显示无效
sizeof只是想让他测试一下字节数。
原则上C没有规定int和long具体是多少位,只是规定long不小于int
额,或者你能不能告诉我,在IAR里面有没有办法定义出来一个32位整数变量?我怎么折腾,都是16位。
stdint.h,了解一下?
使用uint32_t试试?
评分
查看全部评分
早就试过了,sizeof的值也是4
评分
查看全部评分
void HandleADC()
{
char ADCBuff[20];
uint32_t Voltage;
unsigned long Temp;
//第一次读取的ADC值需要丢弃
ADC_Data_Read(&ADCData); //读取ADC的采样数值
ADC_Data_Read(&ADCData); //读取ADC的采样数值
Voltage = ADCData * 330L / 1024L;
Temp = (unsigned int)Voltage;
ADCBuff[5] = 0x0a;
ADCBuff[4] = 0x0d; //换行字符
ADCBuff[3] = Int2HexString(Temp % 100 % 10);
ADCBuff[2] = Int2HexString(Temp % 100 / 10);
ADCBuff[1] = '.';
ADCBuff[0] = Int2HexString(Temp / 100);
Uart1_SendString(ADCBuff,6); //向PC机发送ADC采样数值
}
谢谢你!按照你的做法,运算的时候330和1024后面加L,运算出来的结果就是正确的。