南联网站建设推广,wordpress插件的选择,大厂网站建设,网站建设会计分录怎么做计算机存储数据基本知识计算机中二进制数包括#xff08;正数和负数#xff09;是以补码形式存储。符号位#xff1a;补码的最左侧首位是符号位#xff0c;0表示正数#xff0c;1表示负数。二进制有三种形式#xff1a;原码、反码、补码。正数的补码和反码#xff1a;是…计算机存储数据基本知识计算机中二进制数包括正数和负数是以补码形式存储。符号位补码的最左侧首位是符号位0表示正数1表示负数。二进制有三种形式原码、反码、补码。正数的补码和反码是正数本身原码。负数的反码符号位不变(是1),其余位按位取反不用加一。负数的补码符号位不变(是1)先按位取反再加一。即是反码加一 在计算机内存中负数以补码形式存在即取反再加一。计算机并不直接存储二进制原码而是存储二进制的补码。正数的补码就是原码。比如1原码0000 0001补码也为0000 0001。就存储的是原码0000 00001.而计算机不直接存储负数而是存储负数的补码负数的补码计算规则是符号位不变原码取反再加一。 例如-1怎么存储的原码1000 0001取反1111 1110加一1111 11111111 1111就是-1的二进制补码。当负数要输出给别的程序用的时候怎么办呢总不能把存储的补码给别人的吧给人用之前需要将补码逆向再转换成原码否则数据就不对了。负数转换补码的规则取反再加一符号不变。那么补码转换原码的规则符号不变先减一再取反。这样就得到原码可以输出了。将正数和负数按位取反(~)特别注意~符号取反的用法场景也不一样同样是~符号有的是求反码有的是求补码所以要搞清楚。举两个例子说明1.代码示例一#include stdio.hint main(){int a 0;printf(~0 %d\n,~a);a 1;printf(~1 %d\n,~a);a 2;printf(~2 %d\n,~a);a -1;printf(~(-1) %d\n,~a);a -2;printf(~(-2) %d\n,~a);
}打印~0 -1
~1 -2
~2 -3
~(-1) 0
~(-2) 1~0步骤步骤1首先计算出0的补码即它本身步骤2因为0的补码是负数所以要还原其原码在输出; 0的补码和反码是他本身再对0按位取反就变成1111 1111,因为最高位为1,所以为负数负数是以补码的形式存储所以输出时要转换成正确的原码。因为原码转补码的规则是先取反再加一所以补码转原码的规则是先减一再取反。步骤1首先计算出0的补码即它本身
0的原码的补码是他本身
0000 0000步骤2因为0的补码是负数所以要还原其原码在输出
~0即所有位数按位取反
1111 1111当你要输出的时候编译器发现最高位符号位是1这个数是个负数而负数在计算机里面是用补码存储的所以此时计算机认为这个1111 1111是补码它要转换成原码输出于是先减去1除了符号位不变其他位全部取反。因为原码转补码的规则是先取反再加一
所以补码转原码的规则是先减一再取反。
减一操作
1111 1110取反操作
1000 0001 -1
~1步骤步骤1首先计算出1的补码即它本身步骤2因为1的补码是负数所以要还原其原码在输出;因为原码转补码的规则是先取反再加一所以补码转原码的规则是先减一再取反。步骤1首先计算出1的补码即它本身
1的原码的补码是他本身
0000 0001步骤2因为1的补码是负数所以要还原其原码在输出;
~1的反码即所有位数按位取反
1111 1110如果要输出打印此时编译器发现其为最高位为1,是个负数负数在计算机里面是用补码存储的所以此时计算机认为这个1111 1110是补码它要转换成原码输出于是先减去1除了符号位不变其他位全部取反。减一操作
1111 1101取反操作
1000 0010 -2
~(-1)步骤步骤1首先计算出-1的补码因为负数在计算机中以补码形式存在步骤2再对-1的补码按位取反步骤1首先计算出-1的补码
-1的原码
1000 0001-1的反码即按位取反负号不变
1111 1110加一
1111 1111步骤2再对-1的补码按位取反,包括符号位
~(1111 1111) 0000 0000 0 ~(-2)步骤步骤1首先计算出-2的补码因为负数在计算机中以补码形式存在步骤2再对-2的补码按位取反步骤1首先计算出-2的补码因为负数在计算机中以补码形式存在
-2的原码
1000 0010-2的反码即按位取反负号不变
1111 1101加一
1111 1110步骤2再对-2的补码按位取反
0000 0001 1
2.代码示例二按位取反参与多项运算#include stdio.h int flag 0x104; //0000 0001 0000 0100 int flag2 0x04;printf(flag2 %#x\n,flag2);printf(~flag2 %#x\n,~flag2);int b flag ~flag2;printf(b %#x\n,b);return 0;
}打印flag2 0x4
~flag2 0xfffffffb
b 0x100求flag ~flag21.flag 0x104
二进制原码
0000 0001 0000 0100 2.flag2 0x04
二进制原码
0000 0000 0000 0100~flag2按位取反
1111 1111 1111 1011flag与上flag2的反码0000 0001 0000 0100 1111 1111 1111 10110000 0001 0000 0000 0x100所以b 0x100,和计算机打印的一样。