<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                有些數據在存儲時并不需要占用一個完整的字節,只需要占用一個或幾個二進制位即可。例如開關只有通電和斷電兩種狀態,用 0 和 1 表示足以,也就是用一個二進位。正是基于這種考慮,又提供了一種叫做位域的數據結構。 在結構體定義時,我們可以指定某個成員變量所占用的二進制位數(Bit),這就是位域。請看下面的例子 ~~~ struct bs{ unsigned m; unsigned n: 4; unsigned char ch: 6; } ~~~ `:`后面的數字用來限定成員變量占用的位數。成員 m 沒有限制,根據數據類型即可推算出它占用 4 個字節(Byte)的內存。成員 n、ch 被`:`后面的數字限制,不能再根據數據類型計算長度,它們分別占用 4、6 位(Bit)的內存 n、ch 的取值范圍非常有限,數據稍微大些就會發生溢出,請看下面的例子: ~~~ #include <stdio.h> int main(){ struct bs{ unsigned m; unsigned n: 4; unsigned char ch: 6; } a = { 0xad, 0xE, '$'}; //第一次輸出 printf("%#x, %#x, %c\n", a.m, a.n, a.ch); //更改值后再次輸出 a.m = 0xb8901c; a.n = 0x2d; a.ch = 'z'; printf("%#x, %#x, %c\n", a.m, a.n, a.ch); return 0; } ~~~ 運行結果: ~~~ 0xad, 0xe, $ 0xb8901c, 0xd, : ~~~ 對于 n 和 ch,第一次輸出的數據是完整的,第二次輸出的數據是殘缺的。 第一次輸出時,n、ch 的值分別是 0xE、0x24('$' 對應的ASCII碼為 0x24),換算成二進制是 1110、10 0100,都沒有超出限定的位數,能夠正常輸出。 第二次輸出時,n、ch 的值變為 0x2d、0x7a('z' 對應的 ASCII 碼為 0x7a),換算成二進制分別是 10 1101、111 1010,都超出了限定的位數。超出部分被直接截去,剩下 1101、11 1010,換算成十六進制為 0xd、0x3a(0x3a 對應的字符是 :)。 C語言標準規定,位域的寬度不能超過它所依附的數據類型的長度。通俗地講,成員變量都是有類型的,這個類型限制了成員變量的最大長度,`:`后面的數字不能超過這個長度。 例如上面的 bs,n 的類型是 unsigned int,長度為 4 個字節,共計 32 位,那么 n 后面的數字就不能超過 32;ch 的類型是 unsigned char,長度為 1 個字節,共計 8 位,那么 ch 后面的數字就不能超過 8。 我們可以這樣認為,位域技術就是在成員變量所占用的內存中選出一部分位寬來存儲數據。 C語言標準還規定,只有有限的幾種數據類型可以用于位域。在 ANSI C 中,這幾種數據類型是?int、signed int 和 unsigned int(int 默認就是 signed int);到了 C99,\_Bool 也被支持了。 C語言標準并沒有規定位域的具體存儲方式,不同的編譯器有不同的實現,但它們都盡量壓縮存儲空間。 位域的具體存儲規則如下: 1) 當相鄰成員的類型相同時,如果它們的位寬之和小于類型的 sizeof 大小,那么后面的成員緊鄰前一個成員存儲,直到不能容納為止;如果它們的位寬之和大于類型的 sizeof 大小,那么后面的成員將從新的存儲單元開始,其偏移量為類型大小的整數倍 2) 當相鄰成員的類型不同時,不同的編譯器有不同的實現方案,GCC會壓縮存儲,而 VC/VS 不會
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看