あなたは1ビットのあなたの最初の左シフト後のあなたの「また」セクション、DOESに置くように-1000を反映しています。
問題は、キャストからunsigned intです。上で説明したように、負の数は2の補数で表され、符号が左端のビット(最上位ビット)によって決定されることを意味します。 unsigned intにキャストすると、その値は符号を表さなくなりますが、intがとりうる最大値は増加します。
32ビットのintを仮定すると、MSBは-2^31(= -2147483648)を表し、符号なし整数の2147483648は正の値を表し、2 * 2147483648 = 4294967296になります。 -1000あなたが4294966296.右シフトは2で、これを分割し、あなたはこれが役に立つかもしれ願って2147483148.
に到着し得る:(Print an int in binary representation using Cから印刷funcを修正)
void int2bin(int a, char *buffer, int buf_size) {
buffer += (buf_size - 1);
for (int i = buf_size-1; i >= 0; i--) {
*buffer-- = (a & 1) + '0';
a >>= 1;
}
}
int main() {
int test = -500;
int bufSize = sizeof(int)*8 + 1;
char buf[bufSize];
buf[bufSize-1] = '\0';
int2bin(test, buf, bufSize-1);
printf("%i (%u): %s\n", test, (unsigned int)test, buf);
//Prints: -500 (4294966796): 11111111111111111111111000001100
test = test << 1;
int2bin(test, buf, bufSize-1);
printf("%i (%u): %s\n", test, (unsigned int)test, buf);
//Prints: -1000 (4294966296): 11111111111111111111110000011000
test = 500;
int2bin(test, buf, bufSize-1);
printf("%i (%u): %s\n", test, (unsigned int)test, buf);
//Prints: 500 (500): 00000000000000000000000111110100
return 0;
}
なぜ 'ABS(a)は' ? – DyZ
それは動作します、それは0に印を設定します。あなたがbitmathで 'abs'を実装したいのであれば、これより少し面倒です。 – harold
変数をprintfすると、目的の500の代わりに2147483148が得られます。絶対値を符号なしintに格納しようとしているためabs(a)を使用できません。 -2,147,483,648、右? – Mike