當表示式中存在有符號型別和無符號型別時

2022-05-04 16:21:06 字數 1576 閱讀 3894

以上這種表述是不準確的,正確的結論應為:

「當表示式中存在有符號型別和無符號型別時,預設情況下計算的結果將轉化為無符號型別」

而對於計算過程而言,變數本身轉化為有符號還是無符號數,都不會改變在計算機中儲存的位狀態。

參考如下**:

而如果將printf()函式中的列印型別換成u%即無符號10進製型別時:

1

inti,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的補碼。

從上述結果可知,無論是無符號數變成有符號數還是有符號數變成無符號數,其計算結果都是一樣的,而結果的值是取決於列印的型別。

以下**:

1

int 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

而以下**:

1

int 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等。在計算機語言中,整型資料可以用二進位制 八進位制 十進位制或十六進製制形式並在前面加上 或 表示。如果用二...