[英]How can I determine if I'm overparenthesizing?
我目前正試圖避免在 C 中使用指針算術來編寫模擬器。
通常,如果在 C 中為指針加1
,則改為添加指向對象的大小。 但是,我正在嘗試使用位和字節,所以這是不受歡迎的。
我想知道在這個例子中我是否使用了太多括號:
*(int16_t *)(((intptr_t)bc)+sp)
如果不是,那么它相當於這個嗎? :
*(int16_t *)((intptr_t)bc+sp)
sp
是一個頁對齊的堆棧地址為我的模擬器(通過。獲得mmap
沒有MAP_FIXED
集)。 它是一個intptr_t
類型。
bc
是int16_t *
類型的名稱。 它是一個指向兩個int8_t
組合的指針。
(((intptr_t)bc)+sp)
等價於((intptr_t)bc+sp)
。
但是整個“避免指針算術”的方法是不可移植的。
至少有3個問題:
指針,轉換為整數,當然不會維護所需的數學屬性。
// possible outcome uint16_t x[2]; printf("%llx\\n", (unsigned long long) (intptr_t) &x[0]); // --> abcd0000 printf("%llx\\n", (unsigned long long) (intptr_t) &x[1]); // --> abcd0010
作為整數的差異可能是 16 而不是希望的 2——即使 2 的差異更常見。
此外,對於*(int16_t *)((intptr_t)bc+sp)
,如果sp
是奇數, (int16_t *)
可能會由於對齊限制而失敗。
抗鋸齒問題也會出現。 @安德魯·亨勒
盡管整數這樣避免指針算術有各種陷阱 - 祝你好運。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.