1. 程式人生 > 實用技巧 >[C/C++知識點] 數字後面加U/L/F的含義

[C/C++知識點] 數字後面加U/L/F的含義

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