這是代碼的一部分,旨在轉儲堆疊并在多年前寫的書中顯示其布局。使用(32 位)編譯此代碼-m32以避免任何警告(為什么?)。我無法理解下面的行,因為他沒有涵蓋,所以我來問 StackOverflow。
- 作者試圖通過這條線達到什么目的?
unsigned int a, *x;
x = (unsigned int *) ((unsigned int) &a & ~0xf); // ..What?
順便說一句,如果有人可以命名上述行并為我獲得更好的標題......
uj5u.com熱心網友回復:
讓我們剖析一下作業:
&a是 的地址a。(unsigned int) &a將其轉換為無符號整數。0xf是具有二進制值的整數0...01111。~0xf是它的按位補碼,產生除最少四個 (1...10000) 之外的所有 1。((unsigned int) &a & ~0xf)通過“與”運算子將 a 地址的至少四位設定為零&。這將為您提供小于或等于a可被 16 (0x10) 整除的地址的地址。(unsigned int *) ((unsigned int) &a & ~0xf)將此結果轉換回指向無符號整數的指標。x = (unsigned int *) ((unsigned int) &a & ~0xf);是最后的任務。
中間轉換已完成,因為運算子&僅適用于整數,而不適用于指標。
例如,如果a的地址是 0x123456,那么x將收到 0x123450。
為什么具體這樣做,我不能說,因為缺少背景關系。
只有當指標和整數的大小匹配時,這些轉換才能按預期作業。如果你使用另一個系統,它不一定能作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/465488.html
標籤:C
