![](/img/trans.png)
[英]Negative numbers: How can I change the sign bit in a signed int to a 0?
[英]why can i import negative numbers as int, but not as long int or other larger data types?
當我使用va_arg
導入例如-1
,並且將int
指定為數據類型時,它毫無問題地得到了它。 但是,如果我指定long int
, long long int
或intmax_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.