先看代码
#define TIMER_INTF (1UL << 5)
第一次遇到代码中出现UL,只有数值常数才有后缀说明,这里面UL都是整形常数后缀,这里的UL有两个作用:强制转换,解决溢出问题。
1.C语音中数字常量的表示方式:
- (1)数值常数有:整型常数、浮点常数;
- (2)整型常数的表示形式有:十进制形式、以0开头的八进制形式、以0x开头的十六进制形式,无二进制形式。
- (3)浮点常数的表示形式有:科学计数形式和小数点形式。
2.常见的后缀分两种:整形常数后缀、浮点型常数后缀
- 整形常数后缀:u,U,l,L,UL,ul (不区分大小写,整型常数默认是signed int的。)
- 浮点型常数后缀:f,F,l,L,LF,lf (不区分大小写,浮点常数默认是double的,因浮点型常数总是有符号的,故没有u或U后缀。)
回到正题:
1ul 表示无符号长整形,最高位不作符号位,1ul在32位计算机中存储二进制为
0000 0000 0000 0000 0000 0000 0000 0001
<<5 左移5个单位, 即把1ul 的二进制向左移动5个单位,
第一排: 0000 0000 0000 0000 0000 0000 0000 0001
第二排: 0000 0000 0000 0000 0000 0000 0000 0001
第三排: 0000 0000 0000 0000 0000 0000 0010 0000
第一排是1ul在计算机中的二进制, 第二排是把1ul左移5个单位, 第三排是左移5后得到的结果,前面溢出的5个0被舍弃, 后边的5个空位补0, 最后得到的十进制是32。