#include <stdio.h>
/*
整数在内存中存储的是补码
整数的二进制表示有3中(原反补码)
原码 反码 补码
正数的原反补码相同
负数的原反补码需要计算
7(十进制)
00000000 00000000 00000000 00000111 原码
00000000 00000000 00000000 00000111 反码
00000000 00000000 00000000 00000111 补码
-7(十进制)
10000000 00000000 00000000 00000111 原码(负数最高位为1)
11111111 11111111 11111111 11111000 反码(原码最高位1不变,其他位取反,得到反码)
11111111 11111111 11111111 11111001 补码(反码+1,得到补码)
*/
int main() {
/*
正整数(7)左移一位
00000000 00000000 00000000 00000111 补码(在内存中存储的二进制数,正整数的原反补码相同)
00000000 00000000 00000000 00001110 左移一位时,最前面一位去掉,后面补0。此时得到的是新的补码
但由于正整数原反补码相同,所以这就是原码,对应十进制数是14
*/
int a = 7;
int b = a << 1;
printf("%d\n", b); //左移1位后原码 0......0000 1110 8+4+2=14
printf("%d\n", a);//a不变 7
/*
负整数(-7)左移一位
11111111 11111111 11111111 11111001 补码
11111111 11111111 11111111 11110010 左移一位时,最前面一位去掉,后面补0,得到新的补码
11111111 11111111 11111111 11110001 反码(补码-1,得到反码)
10000000 00000000 00000000 00001110 原码(符号位不变,其他位取反,得到原码,对应十进制数是-14)
*/
int c = -7;
int d = c << 1;
printf("%d\n", d); //左移1位后原码 1......0000 1110 -(8+4+2) = -14
printf("%d\n", c);//c不变 -7
return 0;
}

文章讨论了整数在内存中的补码表示,以及正数和负数的原码、反码和补码之间的关系。通过示例解释了正数和负数左移一位后的二进制变化,展示如何计算新值。
1277

被折叠的 条评论
为什么被折叠?



