[英]C datatype : Between Short and Int
我讀了一本關於C的書,對我來說,最好先展示代碼,然后再問代碼。
#include <stdio.h>
int main(void)
{
short num = 3;
printf("%hd\n" , num );
return 0;
}
#include <stdio.h>
int main(void)
{
short num = 3;
printf("%d\n" , num );
return 0;
}
: I'm using intel based pc so int size is 32-bit. :我使用的是基於Intel的PC,因此int大小為32位。
題 :
1.)書中提到這兩個代碼可以正確運行,盡管其中一個使用%hd
說明符,而另一個使用%d
說明符。
to for faster computation,that is why by using the %d
specifier or even %ld
which is 32-bit would yield the correct result too. 2)書中的原因是因為C機制會自動將類型轉換為以進行更快的計算,因此為什么使用%d
說明符甚至32位的%ld
也會產生正確的結果。
3)我的問題是,什么時候發生這種轉換?是在我們將其作為參數傳遞給printf()
函數的時間里嗎,就像將float變量作為表達式或表達式傳遞給double時如何將其轉換為double一樣。參數,或者在我們初始化變量時使用值3
?
4)實際上我已經做了一個小實驗,即使用sizeof
運算符和printf()
函數打印出變量num的sizeof
,它顯示了2 bytes
但我仍然不確定何時進行轉換。
) 5)如果轉換是在我們將值分配給short變量的時間內發生的,那么創建short變量的意義何在?(** )
非常感謝您的幫助
%d
和%hd
是等效的。 printf()
是一個可變函數,因此規則說“整數提升”應用於參數。 printf()
根本看不到short
值,而只看到int
。 %ld
用於long int
。 它的大小可能比普通int
,所以這本書是錯誤的。 printf()
的調用中。 傳遞給printf()
任何short int
由編譯器轉換為int
。 short int
當然是不會改變的(無論如何也不知道這是什么意思!) sizeof
打印大小時,您正在打印的數字是short int
的大小(該數字的大小為size_t
)。 printf()
甚至看不到short int
, sizeof
運算符沒有,並且報告了正確的大小。 short
變量的關鍵是,如果需要short
變量,則可以創建一個。 當然,對於大多數變量來說都是這樣。 但是,如果您認為不需要專門的short int
,則可以只使用int
。 如果您調用沒有原型的函數或帶有可變參數的函數(例如printf(3)),那么C會應用稱為默認參數提升的東西。
這些轉換將float提升為double,並將小於int
任何值提升為int
或unsigned int
。 這往往會協調大多數類型。
這可能是C引入世界的一個有趣功能。 實際上,它在某種程度上發生在指令集級別或ABI級別。 參數在寄存器中或在堆棧上傳遞,通常沒有人允許未對齊堆棧或在高階位留下垃圾。
C如此出色地匹配硬件並運行得如此之快的另一個原因。
這種轉換發生在調用printf
,因為可變參數的功能,所有參數傳遞進來的一部分...
得到擴大至int
(或double
,如果該參數是一個float
)第一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.