下面的討論,適用於c/c++/c#,我決定使用c#**來演示,為什麼?我覺得這段時間對c#這位兄弟的關注還是太少了。
有些人會抱怨,為什麼下面的**會觸發編譯器的警告:
他們會說:」對乙個byte的操作,按理說,結果應該也是乙個byte呀,為什麼會是乙個int?」
要小心了大兄弟,你要求的東西,可能實際上並不是你真正想要的。
就依你,假設我們生活在這樣乙個世界:對任何byte型別變數的操作也會產生byte型別的結果。
如下圖所示:
這這個理想世界,變數i的值將會是16。為什麼?
因為兩個byte型別的變數相加,也會產生乙個byte的結果,因為這裡存在整型溢位,所以,你會得到16這個結果。驚不驚喜?
類似的:int j = -b;
變數j的值實際上是224,而不是你所預期的-32,也是同樣的整型溢位原因導致的。
所以,請再問問自己,這真的是我想要的嗎?
讓我們來考察下列更加讓人防不勝防的**:
對Byte型別的操作
對byte型別的操作 public class bytes return str 把 string 型別轉換 byte 型別輸出 string 返回 string型別的 byte 值 public static byte getbyte string str return bytearr 把 byt...
i 是否原子操作?並解釋為什麼?
1.i 分為三個階段 記憶體到暫存器 暫存器自增 寫回記憶體 這三個階段中間都可以被中斷分離開.2.i首先要看編譯器是怎麼編譯的,某些編譯器比如vc在非優化版本中會編譯為以下彙編 asm 這種情況下,必定不是原子操作,不加鎖互斥是不行的。假設加了優化引數,那麼是否一定會編譯為 inc dword p...
i 是否原子操作?並解釋為什麼?
1 原子操作是不可分割的,在執行完畢之前不會被任何其它任務或事件中斷。2 不是原子操作。理由 1.i 分為三個階段 記憶體到暫存器 暫存器自增 寫回記憶體 這三個階段中間都可以被中斷分離開.2.i首先要看編譯器是怎麼編譯的,某些編譯器比如vc在非優化版本中會編譯為以下彙編 asm 這種情況下,必定不...