無符號數

無符號數  是計算機編程中的一種數值資料型別 。 有符號數  可以表示特定類型規定範圍內的整數 （ 包括負數 ） ， 而無符號數只能表示非負數 （ 0及正數 ） 。 有符號數能夠表示負數的代價是能夠表示的正數範圍的縮小 ， 因爲其約一半的數值範圍要用來表示負數 （ 如8位有符號整數中 ， 對應8位無符號整數表示128 ~ 255的部分被用於表示 - 127 ~ - 1 ） 。 無符號數可以利用其所佔有的所有位來表示較大的數 。 例如 ， 16位有符號整數可表示 -32768 ~ 32767 之間的任意整數 ， 而16位無符號整數可表示 0 ~ 65535 之間的數 。 若將有符號數轉換爲二進制 ， 則其數值類型允許的最左一位用於表示符號 （ 1爲負數 ， 0爲正數和0 ） ， 但在無符號數中 ， 最左一位與其右各位一樣用於表示數值 。 大多數架構的機器語言不區分有符號數及無符號數 。 然而算術指令通常設定進位標誌等CPU標誌 ， 爲無符號算術及溢出標誌設定 。 這些標誌能夠被帶入隨後的分支及算術指令中 。 C語言及大部分C的派生語言爲其所有有符號數類型及char類型提供了對應的無符號類型 。 在這些語言中 ， 若存在顯式的unsigned標識符 ， 則將此數標識爲無符號 ， 否則爲有符號 （ char類型除外 ） ， 對應地存在signed標識符用於標識有符號數 。 爲數值添加U後綴也可將此數值標識爲無符號數 。 例如 ， 在32位數中 ， 0xFFFFFFFF表示 - 1 ， 但0xFFFFFFFFU表示4294967295 。 編譯器在遇到有符號數與無符號數間的比較 、 算術等操作時常會發出警告 ， 因爲可能因其範圍不同而導致溢出 。 C / C++ 語言規定無符號整數運算不存在溢出 ， 如果結果超出了無符號類型能表示的最大數 ， 則做模運算取餘數 。 例如 ， 對於uint32的 2 - 3 ， 其結果對0x10000模運算取餘數 ， 最終結果爲0xFFFF 。