一、引言
寫代碼的時候往往需要定義許多常量,如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; }