C++14中binary literals的使用詳解
一個(gè)形如42的值被稱作字面值常量(literal),這樣的值一望而知。每個(gè)字面值常量都對應(yīng)一種數(shù)據(jù)類型,字面值常量的形式和值決定了它的數(shù)據(jù)類型。
我們可以將整型字面值寫作十進(jìn)制(基數(shù)為10)、八進(jìn)制(基數(shù)為8)或十六進(jìn)制(基數(shù)為16)數(shù)的形式。以0開頭的整數(shù)代表八進(jìn)制數(shù),以0x或0X開頭的代表十六進(jìn)制數(shù)。
整型字面值具體的數(shù)據(jù)類型由它的值和符號決定。默認(rèn)情況下,十進(jìn)制字面值的帶符號數(shù),八進(jìn)制和十六進(jìn)制字面值既可能是帶符號的也可能是無符號的。十進(jìn)制字面值的類型是int、long和long long中尺寸最小的那個(gè)(例如,三者當(dāng)中最小是int),當(dāng)然前提是這種類型要能容納下當(dāng)前的值。八進(jìn)制和十六進(jìn)制字面值的類型是能容納其數(shù)值的int、unsigned int、long、unsigned long、long long和unsigned long long中的尺寸最小者。如果一個(gè)字面值連與之關(guān)聯(lián)的最大的數(shù)據(jù)類型都放不下,將產(chǎn)生錯(cuò)誤。類型short沒有對應(yīng)的字面值。
盡管整型字面值可以存儲在帶符號數(shù)據(jù)類型中,但嚴(yán)格來說,十進(jìn)制字面值不會是負(fù)數(shù)。如果我們使用了一個(gè)形如-42的負(fù)十進(jìn)制字面值,那個(gè)負(fù)號并不在字面值之內(nèi),它的作用僅僅是對字面值取負(fù)值而已。
指定字面值的類型列表如下:

注:以上內(nèi)容主要整理自《C++ Primer(Fifth Edition)》
測試代碼如下所示:
int test_literal_1()
{
int d = 42; // decimal notation
int o = 052; // octal notation
int x = 0x2a; // hexadecimal notation
int X = 0X2A; // hexadecimal notation
std::cout << "d:" << d << ", o:" << o << ", x:" << x << ", X:" << X << "\n"; // d:42, o:42, x:42, X:42
auto v1 = 42U; // or 42u: 將從unsigned int, unsigned long和unsigned long long中選擇能匹配的空間最小的一個(gè)作為其數(shù)據(jù)類型
auto v2 = 42L; // or 42l: 字面值的類型至少是long
auto v3 = 42UL; // or 42ul: 數(shù)據(jù)類型將根據(jù)具體數(shù)值情況或者取unsigned long,或者取unsigned long long
std::cout << "v1:" << v1 << ", v2:" << v2 << ", v3:" << v3 << "\n"; // v1:42, v2:42, v3:42
std::cout << "v1 type:" << typeid(v1).name() << ", v2 type:" << typeid(v2).name() << ", v3 type:" << typeid(v3).name() << "\n"; // v1 type:unsigned int, v2 type:long, v3 type:unsigned long
return 0;
}C++14中增加了對二進(jìn)制字面值常量(binary literal)的支持:以2為基數(shù)的數(shù)字,數(shù)字間可用分隔符’分隔,帶有0b或0B前綴后面跟著一個(gè)或多個(gè)二進(jìn)制數(shù)字(0, 1)。
自C++14起,在整數(shù)和浮點(diǎn)數(shù)序列中,任意兩位數(shù)字之間允許使用可選的分隔符’,在確定字面值常量時(shí)將忽略它們。
測試代碼如下:
int test_literal_14_1()
{
auto v1 = 0b110;
auto v2 = 0b1111'1111;
auto v3 = 0B1111'1111;
std::cout << "v1:" << v1 << ", v2:" << v2 <<", v3:" << v3 << "\n"; // v1:6, v2:255, v3:255
std::cout << "v1 type:" << typeid(v1).name()
<< ", v2 type:" << typeid(v2).name()
<< ", v3 type:" << typeid(v3).name() << "\n"; // v1 type:int, v2 type:int, v3 type:int
auto v4 = 0b10U;
auto v5 = 0B10L;
auto v6 = 0b0000'0010ULL;
std::cout << "v4:" << v4 << ", v5:" << v5 << ", v6:" << v6 << "\n"; // v4:2, v5:2, v6:2
std::cout << "v4 type:" << typeid(v4).name()
<< ", v5 type:" << typeid(v5).name()
<< ", v6 type:" << typeid(v6).name() << "\n"; // v4 type:unsigned int, v5 type:long, v6 type:unsigned __int64
return 0;
}執(zhí)行結(jié)果如下所示:注意:std::type_info::name在windows和linux輸出的差異

GitHub:https://github.com/fengbingchun/Messy_Test
到此這篇關(guān)于C++14中binary literals的使用的文章就介紹到這了,更多相關(guān)C++binary literals使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言中qsort函數(shù)用法實(shí)例小結(jié)
這篇文章主要介紹了C語言中qsort函數(shù)用法,包括了針對各種數(shù)據(jù)類型參數(shù)的排序,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-09-09
基于malloc與free函數(shù)的實(shí)現(xiàn)代碼及分析
本篇文章介紹了malloc與free函數(shù)的實(shí)現(xiàn)代碼及分析。需要的朋友參考下2013-05-05
Linux搭建C++開發(fā)調(diào)試環(huán)境的方法步驟
這篇文章主要介紹了Linux搭建C++開發(fā)調(diào)試環(huán)境的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

