C语言 数字后加ul

[复制链接]
17156|15
 楼主| 电子乌托邦 发表于 2010-9-19 18:56 | 显示全部楼层 |阅读模式
今天看见有个定义:
#define zero 0ul
0后面ul 表示unsigned long
请教大家:
什么情况下要加ul?
能给个例子吗?
HWM 发表于 2010-9-19 19:51 | 显示全部楼层
整常数缺省类型应该是integer。如果本意就是integer类型的话,自然不用加ul。
ntao0227 发表于 2010-9-19 19:59 | 显示全部楼层
缺省是unsigned int,C语言在运行过程中会隐式的类型转换,有时会使程序出现异响不到的结果。
可以试试 if(-1<ZERO){...}看看结果。
HWM 发表于 2010-9-19 20:04 | 显示全部楼层
to 3L:

整常数类型应该是integer,其可正负。
 楼主| 电子乌托邦 发表于 2010-9-20 08:39 | 显示全部楼层
谢谢楼上几位回复
什么都不加,默认的确是int型
我想知道,在什么情况下必须要加后缀。
ayb_ice 发表于 2010-9-20 08:41 | 显示全部楼层
5# 电子乌托邦
在想要强制转换成L或UL时加或可能产生溢出的时候加
 楼主| 电子乌托邦 发表于 2010-9-20 10:26 | 显示全部楼层
8位单片机下
unsigned long a,b;
a = 10 * 10000;
b = 10ul * 10000;

结果a = 0xffff86a0
b = 0x000186a0
b的结果是我想要的,可是为什么a得到的是错误的结果。
我不知道原因。
瞎猜一下:大多数情况下,我只认为变量有数据类型,因为变量在内存里有空间分配。
今天看了书,整型数据好像也有数据类型,但是整型数据在内存有空间分配吗?
那位大侠能从内存分配角度来讲解一下。
HWM 发表于 2010-9-20 10:46 | 显示全部楼层
本帖最后由 HWM 于 2010-9-20 10:51 编辑

re 7L:

前面说了,常整数的缺省类型是 int 。10 * 10000已经超出int(十六位)的合法表达范围,溢出变成的“负数”。然后赋值给ul类型的a,其过程必须进行符号扩展(十六位的符号位填充前面扩充的高十六位),故变成 0xffff86a0。

如果其中一个常数强制定义成ul(如10ul),则其整个表达式运算中的中间结果都按类型ul处理。这样就不会有溢出,则其结果就是0x000186a0。

要注意的是,表达式运算同样需要中间变量(类似一般变量一样,只是不可见而已)。有变量就该有类型附属,而此类型就是根据表达式中的变量和常数的类型来调整的。
 楼主| 电子乌托邦 发表于 2010-9-20 12:00 | 显示全部楼层
谢谢HWM
似乎明白了,又做了另一个实验。
8位单片机下
unsigned long a,b;
a = 10 * 100000;    // 不同之处多了个0
b = 10ul * 100000; // 不同之处多了个0

结果a = 0x000f4240
b = 0x000f4240
结果却一样
是不是因为100000已经超出16位整形,所以就都按32位来处理了?
不知道我的理解对不对。
HWM 发表于 2010-9-20 12:30 | 显示全部楼层
to 9L:

是的。
 楼主| 电子乌托邦 发表于 2010-9-20 13:14 | 显示全部楼层
谢谢诸位
谢谢HWM
结贴
31306528 发表于 2010-9-20 15:31 | 显示全部楼层
学习学习!~~~~
dogandog 发表于 2011-3-30 09:46 | 显示全部楼层
我也来看看鲜
heiselpy 发表于 2013-4-8 17:24 | 显示全部楼层
标记mark
专注于嵌入式 发表于 2013-4-8 21:34 | 显示全部楼层
加强可移植性,尤其是不同字长的机器上 比如#define SECONDS_PER_YEAR (365*24*60*60)UL
gental 发表于 2014-11-24 14:05 | 显示全部楼层
专注于嵌入式 发表于 2013-4-8 21:34
加强可移植性,尤其是不同字长的机器上 比如#define SECONDS_PER_YEAR (365*24*60*60)UL ...

里面不能加括号吧,编译器会报错的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

140

主题

633

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部