VS2022におけるC++のint、long intの全ビット反転の(個人的に)想定外の挙動について

プログラムを確認したところ、永遠に1が出力され続ける原因は、unsigned intの範囲が大きいためです。

unsigned intは通常32ビットの範囲を持ち、その全ビットが1の場合、値は4,294,967,295となります。この値を右シフトしていく際に、最上位ビットが0になるまでに非常に多くのループが必要になります。

一方、unsigned short intは通常16ビットの範囲を持ち、全ビットが1の場合の値は65,535です。この値であれば、右シフトを繰り返すことで比較的短いループで最上位ビットが0になります。

問題を解決するためには、以下の方法が考えられます:

1.unsigned intの代わりにunsigned short intを使用する。
2.ループ条件を修正し、シフト回数がsizeof(unsigned int) * 8に達したら終了するようにする。

以下は2番の案のコードです。

C

1#include <stdio.h>2 3int count(unsigned int num) {4 int i = 0;5 for (; i < sizeof(unsigned int) * 8; num >>= 1, i++) {6 (num & 1U) ? printf("%d", 1) : printf("%d", 0);7 }8 return i;9}10 11int main(void) {12 unsigned int inte = ~0;13 printf("\nbit ; %d", count(inte));14}

コメントを投稿

0 コメント