你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

在IAR里面,为啥unsigned long只有16位数?

[复制链接]
sunwah 提问时间:2018-8-1 14:50 /
刚刚接触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位数捏。。。。。。。。
收藏 评论14 发布时间:2018-8-1 14:50

举报

14个回答
七哥 回答时间:2018-8-1 15:44:36
你的怎么试的?unsigned long long型,必须不可能是16位。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

sunwah 回答时间:2018-8-1 15:52:40
toofree 发表于 2018-8-1 15:44
你的怎么试的?unsigned long long型,必须不可能是16位。

这个事情也颠覆了我的认识。
unsigned long  Voltage;

Voltage = ADCData * 330;
在ADCData为838的时候,算出来的值应该是276540,但是监控发现算出来是14396。
276540 = 0x4383C
14396 = 0x383C。
也就是说,我只得到16位数。
七哥 回答时间:2018-8-1 16:55:33
本帖最后由 toofree 于 2018-8-1 17:05 编辑

long long显示是有点问题,其它的都可以
傲游截图20180801165513.png
STM1024 回答时间:2018-8-1 18:41:10
sizeof(unsigned long)等于多少?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

feixiang20 回答时间:2018-8-2 01:44:33
stm1024 发表于 2018-8-1 18:41
sizeof(unsigned long)等于多少?

不管是16位编译器tc还是32位编译器vc都是4个字节。 int在14位编译器下是2,32位编译器下是4

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

sunwah 回答时间:2018-8-2 09:07:54
stm1024 发表于 2018-8-1 18:41
sizeof(unsigned long)等于多少?

仿真发现:
sizeof(unsigned long)等于4
sizeof(unsigned long long int)则显示无效
STM1024 回答时间:2018-8-2 09:40:56
feixiang20 发表于 2018-8-2 01:44
不管是16位编译器tc还是32位编译器vc都是4个字节。 int在14位编译器下是2,32位编译器下是4 ...

sizeof只是想让他测试一下字节数。
原则上C没有规定int和long具体是多少位,只是规定long不小于int
sunwah 回答时间:2018-8-2 10:02:32
stm1024 发表于 2018-8-2 09:40
sizeof只是想让他测试一下字节数。
原则上C没有规定int和long具体是多少位,只是规定long不小于int ...

额,或者你能不能告诉我,在IAR里面有没有办法定义出来一个32位整数变量?我怎么折腾,都是16位。
STM1024 回答时间:2018-8-2 11:44:29
本帖最后由 stm1024 于 2018-8-2 11:46 编辑
sunwah 发表于 2018-8-2 10:02
额,或者你能不能告诉我,在IAR里面有没有办法定义出来一个32位整数变量?我怎么折腾,都是16位。 ...

stdint.h,了解一下?
使用uint32_t试试?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

sunwah 回答时间:2018-8-2 13:41:45
stm1024 发表于 2018-8-2 11:44
stdint.h,了解一下?
使用uint32_t试试?

早就试过了,sizeof的值也是4
七哥 回答时间:2018-8-2 14:49:02
本帖最后由 toofree 于 2018-8-2 14:52 编辑
sunwah 发表于 2018-8-2 10:02
额,或者你能不能告诉我,在IAR里面有没有办法定义出来一个32位整数变量?我怎么折腾,都是16位。 ...


傲游截图20170101144728.png

傲游截图20170101144819.png
傲游截图20170101145215.png



评分

参与人数 2ST金币 +1 蝴蝶豆 +4 收起 理由
sunwah + 1 很给力!
zero99 + 4

查看全部评分

sunwah 回答时间:2018-8-3 11:15:16

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,运算出来的结果就是正确的。
robter 回答时间:2018-9-20 22:08:46
又是一个很好的经验
Kevin_G 回答时间:2020-9-23 19:33:56
好经验!

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版