「當表示式中存在有符號型別和無符號型別時,預設情況下計算的結果將轉化為無符號型別」
而對於計算過程而言,變數本身轉化為有符號還是無符號數,都不會改變在計算機中儲存的位狀態。
參考如下**:
而如果將printf()函式中的列印型別換成u%即無符號10進製型別時:1inti,j;
2 unsigned int
x,y,z;
3 i = -5
;4 z = 2
;5 x = i+z; //
unsigned result
6 j = i+z; //
signed result
7 printf("
i=-5;\n z=2;\n x=i+z;\n j=i+z;\n");
8 printf("
i+z=%u \n
",i+z);
9 printf("
x=%u \n
",x);
10 printf("
j=%u \n
",j);
執行結果為:
i=-5;
z=2;
x=i+z;
j=i+z;
i+z=4294967293
x=4294967293
j=4294967293
其中,4294967293的16進製表示為0xfffffffd,即是-3的補碼。
從上述結果可知,無論是無符號數變成有符號數還是有符號數變成無符號數,其計算結果都是一樣的,而結果的值是取決於列印的型別。
以下**:
1int i=-5
;2 unsigned int z=2;3
if(i+z>2
)4 printf("
i+z>2 \n");
5else
6 printf("
i+z<2 \n
");
列印結果為:
i+z>2
而以下**:
1int i=-5
;2 unsigned int z=2;3
if(((int)(i*z))>2
)//強制轉換了
4 printf("
i+z>2 \n");
5else
6 printf("
i+z<2 \n
");
列印結果為:
i+z<2
原因是在邏輯表示式判斷中,
i+z>2
中左側的值需要表現為無符號型別,因此呈現為乙個較大的正數。將+號改成乘號結果也一樣。
因此,可信的結論應該是:
有符號數和無符號數相加時,結果的二進位制表示式不受何種符號型別影響的,而計算結果的值取決於結果所需呈現的型別。
當有符號數和無符號數
出現在同乙個表示式中,預設狀態下(如果不像上述**那樣作強制轉換)表示式的值為將結果轉化為無符號型別的值。
C 資料型別和表示式 1 無符號和有符號整型
對於熟悉的關鍵字,看到了,第一反應必須快速的給出正解,倘若不能,就說明還不夠熟悉。我問自己 資料型別有哪些?似乎一下子說不那麼全。習慣性的要列個圖,不求多高的要求,起碼要和課本上概括的差不多吧。說到資料型別,得記得住這些型別是佔多少位元組吧,畢竟我們是搞地基的。又可以重溫一遍資料型別了,再閉上眼睛回...
警惕邏輯表示式中的無符號型別運算(C語言型別轉換)
今天在處理邏輯表示式時遇到了類似以下程式的問題。if strlen tmp 10 0 這個條件怎麼都進不去。經過vs除錯可發現printf d b 10 0 列印的結果為0。include include int main char tmp 12345 unsigned int b b 5 prin...
資料型別,運算子和表示式
一 python的資料型別分為數字型別 int float complex bool 字串型別 列表型別 元組型別 字典型別和集合型別。1.整形 int 整型表示儲存的資料是整數,例如1 1等。在計算機語言中,整型資料可以用二進位制 八進位制 十進位制或十六進製制形式並在前面加上 或 表示。如果用二...