我們都知道且經常用到 unsigned
關鍵字,但有沒有想過,與此對應的 signed
關鍵字有啥用?
int i = 0;
signed int i = 0;
這倆有區別嗎?沒區別,看起來,signed
完全是個累贅。
真的是這樣嗎?
我查閱了 C++11 的標準文件(草稿N3690),發現一些端倪:
3.9.1 Fundamental types
Objects declared as characters(char) shall be large enough to store any member of the implementation’s basic character set. If a character from this set is stored in a character object, the integral value of that character object is equal to the value of the single character literal form of that character. It is implementation-defined whether a char object can hold negative values. Characters can be explicitly declared unsigned or signed. Plain char, signed char, and unsigned char are three distinct types, collectively called narrow character types. A char,a signed char,and an unsigned char occupy the same amount of storage and have the same alignment requirements(3.11); that is,they have the same object representation. For narrow character types, all bits of the object representation participate in the value representation. For unsigned narrow character types, all possible bit patterns of the value representation represent numbers. These requirements do not hold for other types. In any particular implementation, a plain char object can take on either the same values as a signed char or an unsigned char; which one is implementation-defined.
標準規定的很清楚,char
, signed char
和 unsigned char
是三種不同的型別。 char
會根據具體實現場景,而決定到底是 signed
還是 unsigned
.
再看看 C11 的標準文件(ISO/IEC 9899:201x)呢?
6.7.2 Type specifiers
Each of the comma-separated multisets designates the same type, except that for bit-fields, it is implementation-defined whether the specifier int designates the same type as signed int or the same type as unsigned int.
看來,bit-fields
(位域) 也存在同樣的問題。(位域的概念可能也有點偏,經常寫比較底層的介面或協議童鞋應該熟悉,可參考這裡)
結論
在 C/C++ 中,signed
關鍵字絕大多數情況下都是累贅,但對於上述所言的兩種情況,即在 char
與 bit-fields
的使用過程中,還是有比較隱晦的作用的。
給自己提個醒,總是好的。