unsigned 和 signed 混合運算總是被問及,我這裡總結一下。這裡的幾個情況:
1.同等資料寬度,只要出現 unsigned ,皆以unsigned 運算。
2. 同等符號字首,自動轉化為大位寬大資料範圍處理,如 unsigned long
long 和 unsigned int ,總以 unsigned long
long
處理.3
.不同資料寬度且不同資料符號字首:
<1> unsigned short 和 int ,皆轉化為 int
。
int a = -2
; unsigned
short = 1
; a / b 等於 -2 ,因為以 int
計算;
int a = 2
; unsigned
short = -1
; a / b 等於 0,因為以int 算,unsigned short 轉化為 int ,即為 65535
,結果自然為0
<2> unsigned int 和 short ,皆為 unsigned int
運算; unsigned
int a = +2 / -2
;
short b = 1
; a / b 等於 2或者 0xfffffffe,皆以 unsigned int
算; unsigned
int a = -2
;
short b = -1
; a /b 等於0 ,分子小於分母
<3> unsigned int 和 long ,皆按照 unsigned long 運算,嚴格來說是按照unsigned int
; unsigned
int a = 2
;
long b = -1
; a /b 為0
unsigned
int a = -2
;
long b = 1
; a / b 為 0xfffffffe
<4> unsigned int 和 long
long (__int64),皆按照 long
long
(__int64)處理
<5> unsigned long
long 和 int ,皆按照 unsigned long
long
處理
<6 - n> .....
從這些情況,我們不難得出這樣的結論,混合符號且混合位寬的資料之間運算,總是以大資料範圍大位寬的量為準,再聯想到 1.2情況,發現所有的情況都以大資料範圍大位寬數為準。
得出的結論是:unsigned 或 signed 混和運算,以大資料大位寬量為準。
注意:驗證的時候,不要用 printf 列印出來的資料為準,請反彙編對比。
signed和unsigned的比較
昨天,zrf師兄丟給我這樣乙個題,據說是微軟面試題 unsigned int i 3 cout 問結果是多少。第一反應 3。不過結果似乎不是這樣的,寫了個程式,執行了一下,發現是 4294967293。很詭異的乙個數字,怎麼也想不明白為什麼會是這麼個奇怪的數字。但是在我發現這數的十六進製制數是fff...
signed和unsigned的比較
unsigned int i 3 cout 問結果是多少。第一反應 3。不過結果似乎不是這樣的,寫了個程式,執行了一下,發現是 4294967293。很詭異的乙個數字,怎麼也想不明白為什麼會是這麼個奇怪的數字。但是在我發現這數的十六進製制數是fffffffd時,我想我已經離答案很近了.這個涉及到了混...
unsigned 和 signed 的理解
include int main int argc,char argv 結果 65535 1 這是兩段很簡單的 我就以第二段 為例。c語言中常量整數 1的補碼表示為0xffffffff。擷取後面16位ffff賦值給 變數a unsigned short 此時 a 0xffff a沒有符號位,0xff...