我正在閱讀 Jens Gustedt 的 Modern C,作者指出以下內容,
- 所有值都具有靜態確定的型別。
- 在本章開頭,作者說“C 程式主要根據值而不是它們的表示進行推理”。文字也是如此,比如十進制整數常量表示值的方式,或者它們具有內在價值。
還指出“我們不希望計算結果依賴于平臺特定的可執行檔案,但理想情況下只依賴于程式規范本身。實作這種平臺獨立性的重要一步是型別的概念”。大寫的文本實際上是什么意思,型別如何幫助平臺獨立。型別有什么用?
為什么十進制整數常量是有符號的,而十六進制對應的常量既可以是有符號的也可以是無符號的,即使它們指的是同一組值?
在這一點上我真的很困惑。如果有人能回答每一點并詳細說明,我將不勝感激。
uj5u.com熱心網友回復:
為什么十進制整數常量是有符號的,而十六進制對應的常量既可以是有符號的也可以是無符號的,即使它們指的是同一組值?
你對這部分有點誤解。這實際上與常量的型別有關。這與簽名無關。
因此,假設 32 位 int(2 的補碼),以下適用:
0x7ffffff has type int
0x8000000 has type unsigned int
原因是 0x80000000 大于 INT_MAX,因此不能是 int。
這很重要,因為通常的算術轉換的作業方式。在 0x7fffffff 的情況下,轉換將朝向 int,而在 0x80000000 的情況下,轉換將朝向 unsigned int。
換句話說:
0x.... 始終是大于或等于零的值。如果它的值在 的范圍內int,則其型別將為int。如果它不適合int下一步是查看它是否適合unsigned int在這種情況下它的型別將是unsigned int等等long int, unsigned long int, long long int, unsigned long long int
一個例子(32 位 2 的補碼):
二進制表示 0x80000000 asint表示值 -2147483648。
二進制表示 0x7ffffffff asint表示值 2147483647。
因此,從這一點來看,這0x7fffffff > 0x80000000是真的。對?
嘗試:
int main(void)
{
if (0x7fffffff > 0x80000000)
{
puts("0x7fffffff is bigger than 0x80000000");
}
else
{
puts("0x7fffffff is less than 0x80000000");
}
return 0;
}
所以這“應該”列印:0x7fffffff is bigger than 0x80000000對嗎?
不,它不會。它列印0x7fffffff is less than 0x80000000. 原因是(再次)0x80000000 被認為是 unsigned int,所以比較是在無符號型別上完成的。這說明了為什么整數常量的型別很重要。
最后嘗試:
int main(void)
{
if (((0x7fffffff - 0x40000000) - 0x40000000) > 0)
{
puts("(0x7fffffff - 0x40000000) - 0x40000000) is bigger than zero");
}
else
{
puts("(0x7fffffff - 0x40000000) - 0x40000000) is less than zero");
}
return 0;
}
輸出:
(0x7fffffff - 0x40000000) - 0x40000000) is less than zero
這表明運算式的(0x7fffffff - 0x40000000) - 0x40000000)計算方式為int(即,任何運算元都是無符號的,結果不能小于零)。
uj5u.com熱心網友回復:
為什么十進制整數常量是有符號的,而十六進制對應的常量既可以是有符號的也可以是無符號的,即使它們指的是同一組值?
這似乎暗示了 C 2018 6.4.4.1 5,它指定了整數常量的型別。對于無后綴十進制常量,候選型別都簽署:int,long int,和long long int。(從這其中選擇依賴于常量的值)對于無后綴的十六進制常數,候選型別的混合符號和無符號:int,unsigned int,long int,unsigned long int,long long int,和unsigned long long int。
候選串列的這種規范不是基于每個可以表示的值,因為正如您所指出的,十進制和十六進制表示法都可以表示任何整數值。它只是基于常見用途。十進制常量的使用主要用于有符號型別(例如,在進行一般算術時經常使用十進制常量)并且十六進制常量的使用更加多樣化(例如,在處理位時經常使用十六進制常量),并且大概是 C委員會認為這些規則適合現有的用法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/363238.html
上一篇:在c中使用遞回函式的星形模式
下一篇:C中的字串記憶體重新分配陣列
