C語言的左位移能不能超過8位?

2021-09-22 21:56:10 字數 1294 閱讀 9048

c語言的左位移能不能超過8位?比如b=a<<20; 這樣可以不?如果可以,乙個位元組只有8個位,左移20位是不是連右邊其它位元組的12個位(20-8)也一起左移?

字元變數左移八次後,所有的位都移出去了,繼續左移當然可以,但沒有意義,因為左移八次後八個位都是0,再移沒有意義
追答:

他左邊的位元組不受影響

追問:

int變數a(32個二進位制位)左移25位的話,它是32個二進位制位一起左移還是每8個二進位制位單獨左移25位?

比如a<<=25  它是以全部32個位為整體一起左移25位嗎?也就是32位移出去25位?

還是這32位分成四個位元組,然後以位元組為單位,每個位元組分別左移25位?

追答:

移位是針對所有二進位制位的,不是乙個位元組。a<<=25 每移動一次,32個位都跟著一起向左移一位。

追問:

你說的char變數左移8位後就全都移出去了,再移就沒有意義了因為八個位都是0

但我試過了好像不是這樣

比如char ch=1; printf("%d",ch<<8);結果卻輸出256

printf("%d",ch<<25);結果就輸出33554432

按道理char變數ch左移7位應該就是-128,再移下去就全變成0了,但實際結果卻是移七位的時候還沒有變成-128,而是128,再移下去不但沒有變成0,反而輸出結果更大。。 不知道為什麼會這樣

追答:

其實你問的是另乙個問題了

你以%d格式輸出就不是原來的型別了

追問:

已經定義了char ch,就相當於定義給他分配乙個位元組,至於%d和%c只是把存在記憶體中的那串二進位制以不同形式輸出而已,

乙個char ch最大數就是01111111

按道理左移八位就全部都移出去了,但實際結果不是這樣

追答:

你寫成ch<<8或ch<<25,輸出的是表示式的值,而不是變數的值,在《後面加上=看看,結果是不同的,這時輸出的是變數的值

追問:

哦,明白了,ch<<25並不是賦值給ch

謝謝你了

收起 提問者評價

太給力了,你的回答完美地解決了我的問題,非常感謝!

C語言的左位移能不能超過8位?

c語言的左位移能不能超過8位?比如b a 20 這樣可以不?如果可以,乙個位元組只有8個位,左移20位是不是連右邊其它位元組的12個位 20 8 也一起左移?字元變數左移八次後,所有的位都移出去了,繼續左移當然可以,但沒有意義,因為左移八次後八個位都是0,再移沒有意義追答 他左邊的位元組不受影響 追...

能不能改自己的位置 能不能嫁給比自己學歷低的男人?

我和男友談戀愛3年,他是初中學歷,我是研究生畢業。我們每天有說不完的話,他也很懂我,人也上進踏實。可是周圍人都說這個人的學歷配不上我,結婚後肯定會後悔的,讓我一定要找個學歷高 有房有車的優秀男人,我爸媽也這麼說。現在我很猶豫,因為他想今年定下來,明年結婚。我不知道學歷差異很大,是不是會影響婚內幸福?...

C 虛函式能不能模板化

虛函式不能模板化 編譯器在編譯乙個類的時候,需要確定這個類的虛函式表的大小。一般來說,如果乙個類有n個虛函式,它的虛函式表的大小就是n,如果按位元組算的話那麼就是4 n。如果允許乙個成員模板函式為虛函式的話,因為我們可以為該成員模板函式例項化出很多不同的版本,也就是可以例項化出很多不同版本的虛函式,...