一、引言
写代码的时候往往需要定义许多常量,如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; }