简单剖析C语言中的位扩展问题
在C語言中,數據類型的字節數是不同的。不同的數據類型,二進制的位數也會不同。比如char類型的數據,它的大小是1個字節,二進制位數為8位,int類型的數據是4個字節,那么二進制位數就是32位。
當不同類型的數據進行運算的時候,就會發生強制或隱式類型轉換,通常是低精度的數據類型擴展到高精度的。有些時候,低精度的位數比較少,擴展到高精度的時候,就要在前面補充一些位。那么這些位是補0還是補1呢?
我們首先看一下下面圖片的輸出結果:
雖然 a 和 b 都是1個字節,但是由于需要做加法運算,那么就會將其自動轉化為int類型的數據,得出結果后,再次轉化為char類型。所以a+b的字節大小是4。
這里,c 的結果是 -127 是因為 a =128 ,它的二進制存儲是1000 0000,我們知道最高位代表的是符號位,所以a實際上是 -128, 加了1之后就變成了127
我們再看下面的輸出結果:
我們聲明了一個char 類型的變量 char a = 250,將其賦給了b。在打印的時候,我們打印出 :b&0xff (讓b與16進制的ff,也就是10進制的255做按位與 運算)
這里為什么b的值是-6 而 b&0xff 的值是250呢,我們通過位運算打印出它的二進制位。
再看一下結果:
我們發現當執行int b =a,的時候,由于a是char類型的,在轉化為int類型的時候,會自動補位,因為 a(二進制:1111 1010)的符號位也就是最高位是1,所以就補1。
當我們以%d形式打印出來時,int的最高位也是1,代表負數,所以也是 -6,這樣子就保證了數據的一致性。
如果我們將 a 賦值127,這樣子a的最高位就是0(二進制:0111 1111),再看一下結果
總結:當數據從低精度轉向高精度的時候,遵循:
有符號位擴展符號位,也就是1,
無符號位,擴展0
總結
以上是生活随笔為你收集整理的简单剖析C语言中的位扩展问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 结构体与位域的对齐
- 下一篇: ucontext-人人都可以实现的简单协