一、引言
写代码的时候往往需要定义许多常量,如int num=5等等,这个数字5显然是(默认的)signed int类型;而unsigned int num=5,此时的数字5显然是unsigned int类型。
现在我们定义一个宏变量#define NUM 5,这个数字5是以什么类型存储的呢?答案是signed int。我们再这样定义一个宏变量#define NUM 5LL,此时的数字5又是以什么类型存储的呢?答案是signed long long。
二、解释
代码里会经常看到在一个数字后面加上U、L、F等符号,这表示什么意思呢?
首先说明下每个符号代表的意义:
1、数据类型
空白:默认为有符号整型,相当于signed int。
U(u):表示该常数用无符号整型方式存储,相当于unsigned int。
L(l):表示该常数用有符号长整型方式存储,相当于signed long。
LL(ll):表示该常数用有符号长长整型方式存储,相当于signed long long。
UL(ul):表示该常数用无符号长整型方式存储,相当于unsigned int。
ULL(ull):表示该常数用无符号长长整型方式存储,相当于unsigned int。
F(f):表示该常数用浮点方式存储,相当于float。
2、进制
空白:默认为10进制。
B(b):2进制(仅汇编里使用,C代码里禁止使用,如1101B)。
H(h):16进制(仅汇编里使用,C代码里禁止使用,如1A2H)。
数字前面加0:8进制。
数字前面加0x:16进制
三、举例
#include "stdio.h"
#define NUM1 5
#define NUM2 5U
#define NUM3 5L
#define NUM4 5LL
#define NUM5 5UL
#define NUM6 5ULL
#define NUM7 5.0F
// #define NUM 5F /* 注意这种方式会编译出错,提示在整型常量后不正确使用了F */
int main()
{
int num1 = 5; /* 默认10进制数5 */
int num2 = 0576; /* 8进制数576 */
int num3 = 0x56B3; /* 16进制数56B3 */
// int num = 1101B; /* 2进制数1101,不是10进制数1101。但这种表示方法是汇编里的,TC会编译不过 */
// int num = 1A5H; /* 16进制数1A5。这种表示方法是汇编里的,TC会编译不过 */
/* 打印各类型所占字节数 */
printf("\n各类型所占字节数:\n");
printf("5: %d\n", sizeof(NUM1));
printf("5U: %d\n", sizeof(NUM2));
printf("5L: %d\n", sizeof(NUM3));
printf("5LL: %d\n", sizeof(NUM4));
printf("5UL: %d\n", sizeof(NUM5));
printf("5ULL:%d\n", sizeof(NUM6));
printf("5F: %d\n", sizeof(NUM7));
/* C语言未提供打印2进制的格式化符 */
/* 以8进制打印出num1、num2、num3 */
printf("\n8进制打印:\n");
printf("0%o\n", num1);
printf("0%o\n", num2);
printf("0%o\n", num3);
/* 以10进制打印出num1、num2、num3 */
printf("\n10进制打印:\n");
printf("%d\n", num1);
printf("%d\n", num2);
printf("%d\n", num3);
/* 以16进制打印出num1、num2、num3 */
printf("\n16进制打印:\n");
printf("0x%x\n", num1);
printf("0x%x\n", num2);
printf("0x%x\n", num3);
return 0;
}

浙公网安备 33010602011771号