[C/C++知識點] 數字後面加U/L/F的含義
阿新 • • 發佈:2020-09-15
一、引言
寫程式碼的時候往往需要定義許多常量,如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;
}