這幾天複習了一下整形提公升,正好發現乙個令我非常困惑的問題:
#include
intmain()
輸出結果:
那麼問題來了,%lld輸出沒問題,就是long long int型別,但是為什麼%d輸出就成了1 0 2了呢?
我們先來看如下**:
#include
intmain()
輸出結果:
我們好像發現了什麼,我對上面的現象解釋如下:
因為a、b、c是long long型別,所以為64位數,在列印的時候,分割成6個32位數,%d每次只能讀取其中的32位,第乙個%d讀第乙個32位數,也就是1的低32位(1),第二個%d讀第二個32位數,也就是1的高32位(0),第三個%d讀第三個32位數,也就是2的低32位(2),所以結果就是1 0 2。
因為是小端儲存,低位放在低位址處,高位放在高位址處,而指標是從低位址增加,所以先讀到低32位,後讀到高32位。
這裡需要注意的是分割的時候針對的是補碼,但是正數原反補相同。
請看如下**:
#include
intmain()
因為-2是負數,所以在a中儲存補碼為:
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111110。
分割為兩個32位數,最後輸出結果如下:
正好低32位11111111 11111111 11111111 11111110對應int為-2,高32位11111111 11111111 11111111 11111111對應int為-1。
再看乙個例子:
#include
intmain()
按照上面的推理,short int對應兩個位元組,int對應4個位元組,那列印的時候應該把a和b分割成兩個雙位元組的數,然後結果應該是1 0。也就是a的低16位和a的高16位,但是請看結果:
為什麼和預想的不一樣呢?
我給出的解釋是:不管是什麼型別,最後分割的時候都分割成32位,如果原來不夠32位(比如說char型別),那麼就進行整形提公升變成32位,然後在讀取並且列印的時候,%lld是讀取兩個32位,也就是讀取了long long型別,%d、%hd、%c讀取的則是32位,也就是不管是百分號什麼,讀取的都是32的整數倍。假若說是%d,則先讀取乙個32位數,然後取這個32位數的低8位,下一次讀取的時候則接著讀取下乙個32位數。
上面的現象是在vs2013中發生的,在linux的gcc編譯器可以正確列印,我認為linux的gcc編譯器對於long long型別直接每次讀64位了,不管格式控制符是不是%d,最後再將低32位列印。
乙個用列舉型別定義錯誤碼的Demo
created by gfj43958 on 2017 1 6.網路超時 socket timeout w001 網路超時 網路鏈結異常 socket connect eroor w002 網路鏈結異常 請求引數錯誤 request arguments error w003 請求引數錯誤 wsdl錯...
c 用巨集定義乙個函式
要點 變數都用括號括起來,防止出錯,結尾不需要 在實際程式設計中,不推薦把複雜的函式使用巨集,不容易除錯。多行用 要寫好c語言,漂亮的巨集定義是非常重要的。巨集定義可以幫助我們防止出錯,提高 的可移植性和可讀性等。在軟體開發過程中,經常有一些常用或者通用的功能或者 段,這些功能既可以寫成函式,也可以...
python定義乙個 Python定義乙個類
在物件導向的世界裡,你的 通常稱為 類的方法 method,而資料通常稱為 類的屬性 attribute,例項化的資料物件通常稱為 例項 instance。python使用class建立類。每個定義的類都有乙個特殊的方法,名為 init 可以通過這個方法控制如何初始化物件。類中方法的定義與函式的定義...