簡單剖析C語言中的位擴充套件問題

2021-07-02 14:56:09 字數 1178 閱讀 9605

在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語言中的位運算

0 推薦 在電腦程式中,資料的位是可以操作的最小資料單位,理論上可以用 位運算 來完成所有的運算和操作。一般的位操作是用來控制硬體的,或者做資料變換使用,但是,靈活的位操作可以有效地提高程式執行的效率。c語言提供了位運算的功能,這使得c語言也能像組合語言一樣用來編寫系統程式。位運算子c語言提供了六種...

C語言中的位運算

c語言中的位運算有六個 按位與 按位或 按位異或 取反 左移 右移 除 以外其餘均為二元運算子,即要求運算子兩側均有乙個運算量 位運算量只能為整型或字元型,不能為實型資料。1.按位與 0 0 0 0 1 0 1 0 0 1 1 1 3 5 00000011 00000101 00000001 1 的...

C語言中的位運算

在電腦程式中,資料的位是可以操作的最小資料單位,理論上可以用 位運算 來完成所有的運算和操作。一般的位操作是用來控制硬體的,或者做資料變換使用,但是,靈活的位操作可以有效地提高程式執行的效率。c語言提供了位運算的功能,這使得c語言也能像組合語言一樣用來編寫系統程式。位運算子c語言提供了六種位運算子 ...