実現したいこと
つい数日前C言語を始めた初心者です。C言語の入門書を読みながら、0の「1の補数」を求め、bit単位でその1の数を確認することによってunsigned intないしunsignd long intのビット数を確認しようと試みました。
具体的なコードは後述しています。
追記:
タイトルには全ビット反転の想定外の挙動とありますが、そもそも認識に齟齬があり、「C言語において論理シフトと算術シフトが環境によって変化することに対する無知」、加えて「その他無理解」が原因でした。結果として全ビット反転(1の補数演算子)に関する問題ではなかったので、その旨をここに書いておきます。
似たような知識の欠落・思い込みを持つ初学者のためにはなるかもしれないので、タイトルは修正せずに残しておきます。
発生している問題・分からないこと
変数inteの型をunsignd short intにすると想定通りの結果が出力されます。
該当のソースコード
VS
1#include <stdio.h> 2int count(int num) { 3 int i = 0; 4 for (; !(num == 0); num >>= 1) { 5 (num & 1U) ? printf("%d", 1) : printf("%d", 0); 6 i++; 7 } 8 return i; 9} 10 11int main(void) { 12 unsigned int inte = ~0; 13 printf("\nbit ; %d",count(inte)); 14}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
公式ドキュメントによって(limits.hやsizeofでも)unsigned intは32bitだということが確認できましたが、上記の結果は明らかにその範囲を超えています。
公式ドキュメントの「1の補数演算子」のページも確認しましたが、原因はまだつかめていません。
追記:
コードの12行目の宣言を、
unsigned int inte = ~0;
から
unsigned int inte = ~0U;
にすることも試してみましたが、問題は解決しませんでした。
補足
VS2022のバージョンは17.9.5です。
できる限り調べてからここに投稿していますが、Pythonを独学で学んだ程度のプログラミング歴しか持っていないため、極めて初歩的なミスをしている可能性もあります。
回答2件
あなたの回答
tips
プレビュー