我正在嘗試除錯別人的代碼。
有一個包含各種大小元素的結構,包括定義為的成員
uint16_t attempts
因此在其他地方可以訪問此元素
int x = handle->attempts;
我系統中的 int 是 32 位
假設從結構(uint16_t)中指向的位置加載2個位元組并隱式轉換為int(4個位元組)是否安全。
或者是否有可能將指向的 4 個位元組作為 int 加載(在這種情況下是 2 個 uint16_t 成員的合并)?
uj5u.com熱心網友回復:
int x = handle->attempts;是一個帶有初始化的宣告。在此宣告中,根據 C 2018 6.7 1 中的語法,初始化器是handle->attempts一個初始化器。根據 C 2018 6.7.9 1,初始化器是一個賦值運算式,因此將使用運算式評估規則。
運算式handle->attempts指定由指向的結構的uint16_t命名成員。換句話說,它是成員的左值。根據 C 2018 6.3.2.1 2,此左值將轉換為存盤在指定物件中的值。因此,C 標準規定表示該物件的位元組是根據型別讀取和解釋的。attemptshandleuint16_t
然后 C 2018 6.7.9 11 中的初始化規則告訴我們,該值用作所定義物件的初始值x,使用與簡單賦值相同的約束和轉換。
C 2018 6.5.16.1 指定簡單分配。第 2 段說“將右運算元的值轉換為賦值運算式的型別,并替換存盤在左運算元指定的物件中的值。” 因此,我們從初始化程式獲得的值x被轉換為 , 的型別,int并且表示該型別int中的值的位元組存盤在x.
uj5u.com熱心網友回復:
只要目標型別可以表示所討論的值,就保證將整數值轉換為另一種整數型別會產生相同的值。一個 4 位元組int將能夠表示 的所有值std::uint16_t。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/454258.html
下一篇:ListNode的初始化
