ANSI ISO C的保護規則

2021-08-02 02:39:10 字數 1415 閱讀 9911

」在不同型別間提公升運算元的相對簡單的處理規則「在ansi/iso c中有了一些輕微的改變

舉個例子:

error : 」semantics of 』 >』 change in ansi c

意思是錯誤,語法變化存在於ansi c。

上面指出了有些**在ansi c的「值保護」規則下得到的結果可能跟老的「無符號保護」規則下得到的結果不同。這條警告事實上指出的是:當兩個不同的型別出現在二元操作符的兩側或者對短的整數型別進行提公升時,總是發生的隱式型別轉換語義。

在ansi/iso c的保護規則下,若涉及無符號規則提公升到「大」型別時的行為,一般存在兩種保護規則:無符號保護、值保護二者區別

無符號保護規則:提公升的型別總是無符號的。

值保護規則:如果提公升的型別足夠大,即提公升後的有符號型別能夠表示的了無符號型別,則用有符號型別表示提公升前的無符號型別。若提公升的型別和之前的無符號型別一樣大,則和無符號保護規則一致。

舉個例子:

**片段:

在上述**中,a是unsigned short int型,但在和b進行比較的時候a會提公升位為int型,與真實值10保持一致。

這裡的int和unsigned short int 型別大小不一致,故編譯器選擇了值保護規則,事實上ansi/iso c標準也是採用了值保護規則的。。。

再看一例

**片段:

如果是在無符號保護的規則下(a被提公升為unsigned int,unsigned int 和unsigned long 一樣 大)則會列印出0x8000。但在值保護規則下,a會被提公升為int 型,然後a<<8的結果也會被提公升為long型,如果long型大於int型,則a<<8的結果會帶符號進行提公升,則列印結果為0xffff8000,但是如果long型和int型大小一致則值保護規則和無符號保護規則相一致。因為此編譯器的int 和long大小一致,故列印0x8000總結

針對以上這個保護規則問題,最好的解決辦法就是不要讓它發生,一旦發生那麼勢必會降低程式的可移植性,所以我建議在**中最好避免在同乙個表示式中混用有符號和無符號變數

IAA32過程呼叫暫存器的保護規則

iaa32過程呼叫暫存器的保護規則 2014 08 07 0 收藏 由於作業系統中的共享性質,所以,暫存器也就成為了各個程序或者過程共享資源的一種。那麼發生過程 呼叫的時候,如果呼叫者要用到乙個暫存器裡面的值,但是這個暫存器的內容很可能在被呼叫者執行過程中修改,那麼我們就要在被呼叫過程執行之前,對該...

IAA32過程呼叫暫存器的保護規則

由於作業系統中的共享性質,所以,暫存器也就成為了各個程序或者過程共享資源的一種。那麼發生過程 呼叫的時候,如果呼叫者要用到乙個暫存器裡面的值,但是這個暫存器的內容很可能在被呼叫者執行過程中修改,那麼我們就要在被呼叫過程執行之前,對該暫存器裡面的內容進行保護,以至於不會出錯,暫存器的保護規則也是因為程...

i386 ABI之暫存器保護規則

一 保護原則 被作為函式返回值。對於呼叫者來說,如果在呼叫後必須用到呼叫前的eax的值,則呼叫者必須自己事先儲存eax,即使被呼叫函式沒有返回值也必須遵守這個原則。而對於被呼叫函式,可以隨意的使用eax,不需要對其作任何保護。2.ebx 對於位址無關 position independent cod...