2010-09-01 67 views
1

看看C#數字數據類型,我注意到大多數類型都有簽名和未簽名版本。我注意到,雖然短的和長的「默認」整數都被簽名,並且它們的未簽名的對應物爲uint,ushort和ulong; 「默認」字節是未簽名的 - 並且以sbyte爲單位簽名。C#數字數據類型命名

出於好奇,爲什麼字節和其餘的不一樣?這背後有一個特定的原因,還是「事情就是這樣」?

希望這個問題不是太混亂,因爲我的措辭和過度使用引號。嗯..

+1

我猜這是沒有多大意義的有一個簽名的'字節',而實際的數字類型('int','short','long')應該默認簽名。 – NullUserException 2010-09-01 04:32:20

+0

在C中,「char」是8位數據類型。而且,將「unsigned char」類型定義爲「字節」並不罕見。在C#中,字節或多或少需要克服缺少真正的數字8位字符。 Java採用「字節」作爲標準,C#遵循套件。 – tidwall 2010-09-01 05:21:14

回答

7

我會說一個字節不被視爲數值類型,但定義了一個8位大小的結構。此外沒有簽名的字節概念,它是無符號的。另一手上的號碼首先被認爲是有符號的,所以表明它們是無符號的,這是不常見的前綴

[編輯] 忘記有一個有符號的字節(sbyte)。我認爲這是相當歷史和實際的應用。 Ints比UInts更常見,字節比sbyte更常見。

+0

有趣......我總是看到它在大多數書籍和網站中都與數字類型混在一起(例如數字,字符串,其他等) – Darkwoof 2010-09-01 04:40:42

+0

它絕對是一種類型,但是您是否曾經在數學中使用過一個字節在計算機科學之外。您有其他類型;) – aqwert 2010-09-01 04:45:31

+1

System.Byte與其他整數類型一樣是數字類型。它支持所有相同的運算符,格式化說明符等。實際上在IL中它被稱爲unsigned int8。 – Josh 2010-09-01 04:59:37

1

這實際上只是歸結爲直觀而不一致。如果.NET Framework使用System.UInt8System.Int8與其他整數類型保持一致,則可能會更清晰。但是,它似乎有點武斷。

對於什麼是值得MSIL(所有.NET語言編譯成無論如何)是一個sbyte更一致稱爲int8byte被稱爲unsigned int8short被稱爲int16

但術語字節通常不用於描述數字類型,而是用於處理文件,序列化,套接字等8位數據集。例如,如果Stream.Read與System.Int8 []數組一起工作,那會是一個非常不尋常的外觀API。

+0

你的意思是在你的第一段中有'ubyte'嗎? 'byte'和'sbyte' *是* C#所附帶的內容。 – 2010-09-01 05:33:49

+0

我想它沒有出來,但我的意思是說我喜歡C#使用字節和sbyte,因爲它確實如此,但爲了保持一致性,感覺它們應該分別映射到System.UInt8和System.Int8。 – Josh 2010-09-01 05:56:12

3

歷史上術語字節,半字節和位表示存儲單元,助記符或代碼...不是數字值。負兆字節的內存或添加ASCII代碼1和2期待代碼3有點傻。在許多方面,沒有像簽名的「字節」那樣的東西。有時候,「事物」和「價值」之間的界限非常模糊......與大多數將字節視爲事物和價值的語言一樣。

1

這更多的是條款的腐敗程度。一個字節在任何形式上都不是固有的數字,它只是一個存儲單元。

然而,字節,字符和8位有符號/無符號整數不得不使用他們的名字互換,他們可能不應該有:

  • 字節表示的8位數據,說 一無所知格式的數據。
  • 字符表示 存儲單個文本字符的表示的一些數據。
  • 「UINT8」/「INT8」表示 數據的8位,有符號或無符號格式, 存儲數字整數值。