簡體   English   中英

C數據類型:在Short和Int之間

[英]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變量的意義何在?(**

非常感謝您的幫助

  1. 是的,在這種情況下, %d%hd是等效的。 printf()是一個可變函數,因此規則說“整數提升”應用於參數。 printf()根本看不到short值,而只看到int
  2. %ld用於long int 它的大小可能比普通int ,所以這本書是錯誤的。
  3. 轉換發生在對printf()的調用中。 傳遞給printf()任何short int由編譯器轉換為int short int當然是不會改變的(無論如何也不知道這是什么意思!)
  4. 當您使用sizeof打印大小時,您正在打印的數字是short int的大小(該數字的大小為size_t )。 printf()甚至看不到short intsizeof運算符沒有,並且報告了正確的大小。
  5. 創建short變量的關鍵是,如果需要short變量,則可以創建一個。 當然,對於大多數變量來說都是這樣。 但是,如果您認為不需要專門的short int ,則可以只使用int

如果您調用沒有原型的函數帶有可變參數的函數(例如printf(3)),那么C會應用稱為默認參數提升的東西。

這些轉換將float提升為double,並將小於int任何值提升為intunsigned int 這往往會協調大多數類型。

這可能是C引入世界的一個有趣功能。 實際上,它在某種程度上發生在指令集級別或ABI級別。 參數在寄存器中或在堆棧上傳遞,通常沒有人允許未對齊堆棧或在高階位留下垃圾。

C如此出色地匹配硬件並運行得如此之快的另一個原因。

這種轉換發生在調用printf ,因為可變參數的功能,所有參數傳遞進來的一部分...得到擴大至int (或double ,如果該參數是一個float )第一。

暫無
暫無

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

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