我把一個整數值轉成short,但是當我列印short的十六進制結果時,顯示為4個位元組,我找不到原因。
#include <stdio.h>
void main()
{
int j = 53191;
short s = (short)j;
printf("s = %x",s);
}
輸出: ffffcfc7
uj5u.com熱心網友回復:
原因是因為說明%x符期望傳遞一個 32 位整數(默認引數提升)。
在0xFFFF之前的數字表示,您的號碼是,事實上,負。這是因為53191高于“簽名閾值” short(即 32k(-32,768 到 32,767))。
使用低于 32k 的值再試一次或使用unsigned short,您的結果應該相應地改變。
或者,請參閱說明printf并在 x 之前使用 h 說明符。( %hx) 相反,它會告訴printf期望一個short.
(感謝 Adrian Mole 提醒我)
uj5u.com熱心網友回復:
如果我們假設它int是 4 個位元組并且short是 2 個位元組,那么該值53191不適合 short。然后發生的事情沒有明確定義:
否則,新型別是有符號的,值不能在其中表示;要么結果是實作定義的,要么引發實作定義的信號。
因此,由編譯器按照它認為合適的方式處理這種情況。一個常見的實作是將原始型別的二進制表示視為新型別的相應 2 的補碼表示。在這種情況下0xCFC7,它被視為short值為 -12345。
接下來,%x假設一個型別為 的引數unsigned int。printf("s = %x",s);因此也沒有明確定義 - 嚴格來說,這是未定義的行為。
在實踐中,s將根據適用于所有可變引數函式(如 printf)的“默認引數提升”的要求進行提升。也就是說,從short到int。然后一個常見的非標準擴展是重新解釋被提升為intunsigned int的二進制表示。如果發生這種情況,我們將觀察在引數提升期間發生的符號擴展,這意味著該值將從0xCFC7變為0xFFFFCFC7。但是列印intwith%x并不能保證行為,所以我們不應該依賴它或撰寫這樣的代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/336493.html
