int 和 unsigned int 誰的數值範圍更大?
答案是 unsigned int。原因:int 的 0 有 +0/-0 之分(補碼表示下實際只有唯一 0,但符號位佔用一位),而 unsigned int 所有位均表示數值,故範圍更大。
#include <stdio.h>
int main(int argc, char** argv) {
int val = -15;
unsigned int value = 13;
int sum = value + val;
printf("sum %d\n", sum);
return 0;
}
輸出結果:sum -2
根據 C 標準「整數提升」與「常規算術轉換」:
char、short 自動提升為 intunsigned char、unsigned short 提升為 unsigned intsigned/unsigned 運算時,**數值範圍較小的類型向較大類型轉換**本例中 val (int) 被轉為 unsigned int,即 4294967281 (32位)。相加得 4294967294,賦值給 int sum 時截斷為補碼 -2。
(int)value + val-Wsign-compare / -Wsign-conversion 必開啟