為什么在使用 %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);
}
uj5u.com熱心網友回復:
假設int是 32 位,short是 16 位,并且體系結構使用二進制補碼:當您設定y=-1從 signed 到 unsigned yield 的轉換時65535。當y傳遞給printf它時被提升回int,但這次該值65535是可表示的,因此printf將列印65535。
uj5u.com熱心網友回復:
變數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。
uj5u.com熱心網友回復:
因為你已經定義y為unsigned short. 由于-1絕對是一個符號整數,因此編譯器不能將其存放成Y作為-1代替它會被存盤為65535它的溢位效果-1。即無符號短程65536 - 1。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/341545.html
