标题: IAR STM8 C语言中定义的unsigned long int数据类型最大值只能是32768 [打印本页]

作者: donny123800    时间: 2022-6-7 20:09
标题: IAR STM8 C语言中定义的unsigned long int数据类型最大值只能是32768
我想在IAR STM8S  中定义一个4字节变量  存放充值的金额,结果当数据  CZ超过32768的时候就错误了!不知道是哪里出问题了~~大神指点下吧~unsigned   long   int   CZ;
.
CZ=CZ+num2;  
.

作者: Hephaestus    时间: 2022-6-7 21:58
要学会查编译器手册。
作者: 17337161031    时间: 2022-6-7 22:00
你查一下 long int 是几位数据,应该是达到最大值 超出范围
作者: donny123800    时间: 2022-6-7 23:42
17337161031 发表于 2022-6-7 22:00
你查一下 long int 是几位数据,应该是达到最大值 超出范围

我理解的long  int  应该是4个字节的数据!但是实际上这个值只能取到32767以内
作者: Hephaestus    时间: 2022-6-7 23:55
donny123800 发表于 2022-6-7 23:42
我理解的long  int  应该是4个字节的数据!但是实际上这个值只能取到32767以内

你要学会查阅编译器手册的能力。
作者: lkc8210    时间: 2022-6-8 09:28
donny123800 发表于 2022-6-7 23:42
我理解的long  int  应该是4个字节的数据!但是实际上这个值只能取到32767以内



作者: donny123800    时间: 2022-6-8 17:28
lkc8210 发表于 2022-6-8 09:28

多谢!我换个类型试试看!
作者: 188610329    时间: 2022-6-8 18:02
donny123800 发表于 2022-6-7 23:42
我理解的long  int  应该是4个字节的数据!但是实际上这个值只能取到32767以内

一般情况下,long是long,int是int。
long int 应该是你自创的类型,自创类型不是不可以,但你如果希望达到你的预期效果的话,是不是应该把编译器先设定好?
作者: donny123800    时间: 2022-6-8 21:45
188610329 发表于 2022-6-8 18:02
一般情况下,long是long,int是int。
long int 应该是你自创的类型,自创类型不是不可以,但你如果希望 ...

long 定义的变量一样的不能超过32767  只要超过这个范围一定出错~
作者: donny123800    时间: 2022-6-8 21:45
17337161031 发表于 2022-6-7 22:00
你查一下 long int 是几位数据,应该是达到最大值 超出范围

4字节的数据
作者: donny123800    时间: 2022-6-8 21:46
donny123800 发表于 2022-6-8 21:45
long 定义的变量一样的不能超过32767  只要超过这个范围一定出错~

所以不知道是哪里出问题了!多谢大侠指点哈!
作者: Hephaestus    时间: 2022-6-8 22:23
donny123800 发表于 2022-6-8 21:46
所以不知道是哪里出问题了!多谢大侠指点哈!

六楼已经贴出编译器手册,那就不是long数据长度的问题,应该出在别的地方,多贴一些代码。
作者: donny123800    时间: 2022-6-9 08:23
Hephaestus 发表于 2022-6-8 22:23
六楼已经贴出编译器手册,那就不是long数据长度的问题,应该出在别的地方,多贴一些代码。

问题就是现在我给变量直接赋值  如果取值在0~32767 这个范围内就正常    取值32768~65536 之间就错误   超出65536就正常  就是不知道是哪里出问题了!本人实在是菜鸟!找不到问题在哪里了!
作者: startxk    时间: 2022-6-9 09:19
有符号整形变量int型的,在c语言里面规定是用两个字节也就是16个二进制位来表示的。最高为用来表示正负,后面还有15位数,于是一共可以表示2的15次方个数字,也就是32768个,但是呢,数字0是用的16个二进制0表示的,所以正数只能到32767了,负数则是到-32768。所以它是因为变量为负数报错。
作者: startxk    时间: 2022-6-9 09:37
int本来不就是16位么? 在很久很久以前,C语言才出现的时候,计算机的字宽是16位,int于是也就是16位. 后来出现了32位机的时候,int才有32位宽.不过在8位和16位的CPU上,int还是16位.这是编译器的问题,如果编译器将int认为16位,那么在这个编译环境中就是16位,如:Keil C和IAR中int都是16位,在IAR FOR STM8中用unsigned long int\unsigned int\unsigned long\long都不行,最多只能到16位了。此外IAR会把用完的局部变量优化掉。最好定义为全局变量然后观察,不然,有可能被优化掉了,什么也看不到;int型通常就是16位。
作者: donny123800    时间: 2022-6-9 11:21
startxk 发表于 2022-6-9 09:37
int本来不就是16位么? 在很久很久以前,C语言才出现的时候,计算机的字宽是16位,int于是也就是16位. 后来出现 ...

好勒!多谢!按照你这个思路应该是可以解决了!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1