簡體   English   中英

如果一個 C 有符號整數類型以 22 位存儲,它可以存儲的最小值是多少?

[英]If a C signed integer type is stored in 22 bits, what is the smallest value it can store?

我正在學習數據分配,有點困惑。

如果您正在尋找可以存儲在特定位數中的最小值或最大值,那么數據類型是什么重要嗎?

可以存儲在 22 位中的最小或最大數字不是 22 1 的正數或負數嗎? 這個問題的第一部分是紅鯡魚嗎? 最小值不是 -4194303 嗎?

一個 22 位數據元素可以存儲 2^22 個不同值中的任何一個。 這些值的實際含義是一個解釋問題。 該解釋可能由編譯器或某些硬件強加,或者可能在程序員的控制下,並適合某些特定應用程序。

當然,一個簡單的解釋是將 22 位視為無符號整數,值從 0 到 (2^22)-1。 二進制補碼,有符號整數是對相同位的稍微復雜的解釋。 或者您(或編譯器或 CPU)可以將 22 位分成尾數和指數,並存儲一系列十進制數。 范圍和精度將取決於分配給尾數的位數和分配給指數的位數。

或者,您可以將這些位分開,將一些用作分子,將一些用作分數的分母。 或者,事實上,其他任何事情。

這些位的解釋有些是內置在硬件中的,有些是由編譯器或庫實現的,有些則完全在程序員的控制之下。 並非所有編程語言都允許程序員以自然或有效的方式操作單個位,但有些語言確實如此。 有時,使用非常規的二進制數據解釋可以顯着提高效率,但通常會以犧牲可讀性和可維護性為代價。

所以,是的,數據類型是什么很重要。

沒有任何定律(人類、邏輯或自然)規定位必須僅以這樣的模式表示數字:一位代表 2 0 ,另一位代表 2 1 ,另一位代表 2 2 ,依此類推(以及代表的數字)是 1) 位的那些值的總和。 我們可以選擇如何使用位來表示數字,包括:

  • 這些位確實使用該模式,因此 22 位可以表示從 0 到 2 0 + 2 1 + 2 2 + … + 2 21 = 2 22 − 1 = 4,194,303 之和的任何數字。 可表示的最小值為 0。
  • 這些位主要使用該模式,但對其進行了修改,以便一位表示 -2 21而不是 +2 21 這稱為二進制補碼,可表示的最小值為 -2 21 = -2,097,152。
  • 除了表示值除以 1000 之外,位表示數字如上所述。這稱為定點 在第一種情況下,所有位 1 表示的值將是 4194.303,但可表示的最小值將是 0。通過 1/1000 縮放的二進制補碼和定點組合,可表示的最小值將是 -2097.152。
  • 這些位代表一個浮點數,其中一位代表符號(+ 或 -),某些位代表指數和其他信息,其余位代表有效數 在常見的浮點格式中,當該指數和其他字段中的所有位均為 1 且有效位字段位為 0 時,根據符號位,該數字表示 +∞ 或 -∞。 在這種格式中,可表示的最小值是 −∞。
  • 例如,我們可以指定位模式來任意表示數字。 我們可以說 0000000000000000000000 代表 34, 000000000000000000000000000000001 代表 -15, 0000000000000000000010 代表 5, 00000000000000010000000000100000000000000000000000000000000000000000000001 最小的可表示值將是這些任意值中最小的一個。

所以最小的可表示值完全取決於類型,因為數據的“類型”包括位表示值的方案。

如果類型是“有符號整數類型”,則表示仍有一定的靈活性。 大多數現代 C 實現(和其他編程語言)使用上述二進制補碼方案。 但是 C 標准仍然允許另外兩種方案:

  • 一個的補碼:如果第一位為 1,則表示的值為負,其大小是通過對其余位進行補碼並將它們解釋為二進制來給出的。 以六位為例,101001 將是負數,幅度為 10110 2 = 22,所以 -22。
  • 符號和大小:如果第一位為 1,則表示的值為負,其大小通過將其余位解釋為二進制來給出。 使用相同的位,101001 將是負的,大小為 01001 2 = 9,所以 -9。

在補碼和符號和大小中,22 位的最小可表示值是 -(2 21 -1) = -2,097,151。

為了進一步擴展這個問題,C 定義了標准整數類型,但允許實現來擴展語言。 一個實現可以定義一些“有符號整數類型”,使用任意方案來表示數字,只要該方案包含一個符號,以使名稱正確。

在不涉及關於用 Two 的贊美做數學的技術術語的情況下,我將嘗試用簡單的語言來解釋。

首先,您需要使用“位數”的冪來提高 2。 讓我們舉一個 8 位類型的例子,

一個無符號 8 位整數可以存儲 2 ^ 8 = 256 個值。 由於值是從 0 開始索引的,因此值的范圍是 0 - 255。

假設你想存儲有符號值,所以你需要得到一半(簡單地除以 2),256 / 2 = 128。記住我們從零開始,你可能正確地認為你可以從零開始存儲 -127 到 127在雙方。

只要知道只有零(沒有像 +0 或 -0 這樣的東西),所以你從零開始到正一半。 0 到 127,從 -1 到 -128 為負一半

因此范圍是 -128 到 127。

對於 22 位有符號整數,您可以進行數學運算,

2 ^ 22 = 4,194,304

4194304 / 2 = 2,097,152

-1 為正面,

范圍是 -2097152 到 2097151。

要回答您的問題,-2097152 將是您可以存儲的最小數字。

感謝所有人的回復。 我在您所有信息的幫助下弄清楚了,但我會解釋答案,以確切說明我有哪些知識差距導致了我的誤解。

數據類型在這個問題中很重要,因為對於有符號數據類型,第一位用於表示二進制數是正數還是負數。 0111 = 7 和 1111 = -7

sign int 和 unsigned int 使用相同的位數,32 位。 由於 unsigned int 是無符號的:第一位不用於表示正數或負數,因此它可以用該額外位表示更大的數字。 1111 轉換為無符號整數是 15,而對於有符號整數,它是 -7,因為最左邊的位代表符號:1 是負數,0 是正數。

現在回答“如果 C 有符號整數類型以 22 位存儲,它可以存儲的最小值是多少?”:

如果您將二進制轉換為十進制,您會得到 1111111111111111111111 = 4194304 這個十進制值 -1 是無符號可以容納的最大值。 由於我們的數據類型是有符號的,它必須少使用一位作為數字值,因為第一位代表符號。 這給了我們 -2097152。

再次感謝大家。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM