C++14中binary literals的使用詳解
一個形如42的值被稱作字面值常量(literal),這樣的值一望而知。每個字面值常量都對應一種數(shù)據(jù)類型,字面值常量的形式和值決定了它的數(shù)據(jù)類型。
我們可以將整型字面值寫作十進制(基數(shù)為10)、八進制(基數(shù)為8)或十六進制(基數(shù)為16)數(shù)的形式。以0開頭的整數(shù)代表八進制數(shù),以0x或0X開頭的代表十六進制數(shù)。
整型字面值具體的數(shù)據(jù)類型由它的值和符號決定。默認情況下,十進制字面值的帶符號數(shù),八進制和十六進制字面值既可能是帶符號的也可能是無符號的。十進制字面值的類型是int、long和long long中尺寸最小的那個(例如,三者當中最小是int),當然前提是這種類型要能容納下當前的值。八進制和十六進制字面值的類型是能容納其數(shù)值的int、unsigned int、long、unsigned long、long long和unsigned long long中的尺寸最小者。如果一個字面值連與之關(guān)聯(lián)的最大的數(shù)據(jù)類型都放不下,將產(chǎn)生錯誤。類型short沒有對應的字面值。
盡管整型字面值可以存儲在帶符號數(shù)據(jù)類型中,但嚴格來說,十進制字面值不會是負數(shù)。如果我們使用了一個形如-42的負十進制字面值,那個負號并不在字面值之內(nèi),它的作用僅僅是對字面值取負值而已。
指定字面值的類型列表如下:
注:以上內(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中選擇能匹配的空間最小的一個作為其數(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中增加了對二進制字面值常量(binary literal)的支持:以2為基數(shù)的數(shù)字,數(shù)字間可用分隔符’分隔,帶有0b或0B前綴后面跟著一個或多個二進制數(shù)字(0, 1)。
自C++14起,在整數(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++實現(xiàn)LeetCode(50.求x的n次方)
這篇文章主要介紹了C++實現(xiàn)LeetCode(50.求x的n次方),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07C++報錯 XX does not name a type;
這篇文章主要給大家介紹了C++報錯 XX does not name a type;field `XX’ has incomplete type解決方案,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下2023-08-08