簡體   English   中英

使用 %d 的 unsigned short int 和 unsigned int 中的 printf

[英]Printf in unsigned short int and unsigned int using %d

為什么在使用 %d 時在第二個 printf 中我沒有得到 -1?

#include<stdio.h>
int main(){
    unsigned int u=-1;
    unsigned short int y=-1;
    printf("%d %u\n",u,u);
    printf("%d %u",y,y);
}

假設int是 32 位, short是 16 位,並且體系結構使用二進制補碼:當您設置y=-1 ,從有符號到無符號的轉換產生65535 y傳遞給printf它被提升回int ,但這次值65535是可表示的,因此printf將打印65535

變量u被聲明為具有unsigned int類型。

unsigned int u=-1;

因此,您不能將轉換說明符%d與此變量一起使用,因為u的值無法在int類型的對象中表示。 您必須使用轉換說明符%u

至於您的問題,那么變量y的類型為unsigned short並且在將整數提升為int類型后,其值作為無符號值可以表示為int類型的對象。 所以輸出正值。

在本聲明中

unsigned short int y=-1;

整數常量-1被轉換為unsigned short類型,如果您的編譯器支持整數的 2 的補碼表示,則轉換后的值表示正值 USHRT_MAX。

因為您已將y定義為unsigned short 因為-1絕對是一個有符號整數,所以編譯器不會將它作為-1存儲到 y 中,而是將它存儲為65535 ,這是-1的溢出結果。 即無符號短范圍65536 - 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM