簡體   English   中英

為什么我可以將負數導入為int,但不能導入為long int或其他較大的數據類型?

[英]why can i import negative numbers as int, but not as long int or other larger data types?

當我使用va_arg導入例如-1 ,並且將int指定為數據類型時,它毫無問題地得到了它。 但是,如果我指定long intlong long intintmax_t ,它將顯示4294967295

如果我指定unsigned int ,這將是可以理解的。 但是我要指定一個比int更大的帶符號數據類型。 如何獲得此輸出?

va_arg(valist, int) -> -1 (OK)
va_arg(valist, long int) -> 4294967295 (???)

根據語言定義, -1被認為是int常數。
如果需要一個long int常量,則需要附加一個L: -1L

表達式-1類型為int (因為常量1類型為int並且對它應用-運算符將保留該類型),因此必須從具有該類型的變量參數列表中檢索它。 如果嘗試使用long int ,則會調用未定義的行為,因為類型的大小可能不相同,即,您在堆棧中壓入4個字節,但試圖讀取8個字節。

在這種情況下可能發生的情況是,讀取了4個字節並設置了所有位(您傳入的-1),然后又讀取了4個字節,都為0。這8個字節用小端字節順序解釋為8位long ,您所看到的價值。 但這又是未定義的行為。 如果接下來的4個字節不是0,那么您將獲得一個不同的值。

如果您輸入的是-1L則需要使用long int

您必須使用int ,然后(隱式或顯式)將其轉換為long va_arg使用您傳遞的數據類型的大小,並且嘗試檢索錯誤的數據類型是未定義的行為。

例:

long a = va_arg(ap, int);

另一種選擇是將-1L傳遞給該函數,然后使用long調用va_arg

func(arg1, arg2, arg3, -1L);

1是類型為int的整數文字。 我們怎么知道呢? 我們檢查參考

整數文字的類型是該值適合的第一種類型,這取決於使用哪個數字基數和使用哪個整數后綴的類型列表。

參考表

嚴格來說-1是一個表達式,該表達式求值為-1 int類型的對象。 如果您明確需要類型,則可以使用給定的后綴之一。 如果要long使用-1L

暫無
暫無

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

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