有符號執行位操作導致的BUG

2021-10-10 12:37:50 字數 378 閱讀 3891

在c語言中,如果在未知的有符號上執行位操作,很可能會導致緩衝區溢位,從而在某些情況下導致攻擊者執行任意**,同時,還可能會出現出乎意料的行為或編譯器定義的行為。

如下列**:

#include

intmain

(void

)

但是由於int型別的最高位是符號位,剩下的31位才用來儲存數值,y>>24的結果應該是0xffffff80(負數右移,左補1),當我們以無符號整型輸出時,為正數的0xffffff80,以有符號整型輸出時,應減一再取反,結果為-128。

以上說明了在不確定int型別時,避免對其進行位操作,若int型別為負數時,對其進行位操作再進行其它操作(如:轉成無符號型別),可能會使程式出現bug。

有符號數的符號位擴充套件

char和int型別都是由符號數型別,char型別的變數佔據1個位元組的容量,int型別的變數佔據4個位元組的容量。那麼,把char型別變數賦給int型別變數,會有什麼問題產生?我們會很直觀地認為,把1個位元組大小的資料,放入4個位元組大小的容量,沒有任何問題啊!我們做如下的乙個測試例子 inclu...

32 位的有符號整數 如何在C和C 中操作位

計算機中的所有資料均以二進位制表示,即0或1。計算機不理解我們的語言,它們理解位。通常,程式設計師並不關心位級別的操作。但是有時程式設計師必須更深入地研究並研究位元。位表示 在程式設計中,將n位整數儲存 為由n位組成的二進位制數。因此,乙個32位整數由32位組成,而64位 整數由64位組成。在c 程...

8位有符號數的取值範圍

首先我們知道,計算機以補碼的形式儲存的,正數的補碼是原碼不變,負數的補碼是原 碼的取反加1。我們先來看 127,原碼0111 1111對吧,若 128是多少呢,0111 1111 1 1000 0000 原碼 然後儲存時,計算機一看是最高位為1,就保持符號位不變,後面7位取反加 1,然後呢,進製捨棄...