I:原码,补码和反码
1. 在计算机系统中,数值一律用补码来存储
使用补码,可以将符号位和其他位统一处理;同时减法也可按加法处理。
两个用补码表示的数相加是,如果最高位(符号位)有进位,则进位被抛弃。
2.正数的补码和原码相同
3.负数的补码:符号位为1,其余位为原码按位取反,然后整个数+1
4.已知补码求原码:
负数:(符号位)为1,其余各位取反,然后整个数+1
5.模:
一个计量系统的计数范围,时钟的计量范围是0~11,模=12
模实质上说计量器产生“溢出”的量,它的值在计量器表示不出来,计量器上只能给你表示出模的余数。任何有模的计量器,均可减法为加法运算。例如当前时间是6点,但时钟指向10点,那么可以倒拨4的小时 10 - 4 = 6;也可以顺拨8个小时 (10 +8)%12 = 6 ,对于模而言,8和4互为补数,两者相加等于模。
Int32 a = -1 使用Convert.ToString()方法转换为字符串时,会转换成一个32位长度的字符串 11111111111111111111111111111111 对这里还是不明白。首位为1(负号)后面取反?写个小东西验证一下。
namespace SchedulerEngine
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
int a = -12341;
string t = GetComplement(a);
Debug.WriteLine(GetStOfInt(a * -1));
}
public static string GetStOfInt(int _a)
{
return Convert.ToString(_a, 2);
}
public static string GetStOfInt(long _a)
{
return Convert.ToString(_a, 2);
}
public string GetComplement(int _a)
{
Debug.WriteLine(GetStOfInt(_a));
if (_a >= 0)
{
return Convert.ToString(_a, 2);
}
else
{
//得到一个位数相同,但首位(符号位)为1(负),其他位为零的数
int b = 1 << (Convert.ToString(_a, 2).Length - 1);
Debug.WriteLine(GetStOfInt(b));
//两者相减,得到一个去掉符号位的数
int a = _a - b;
Debug.WriteLine(GetStOfInt(a));
//取反加1得到原码
int c = ~a; //这个操作会增加一位,为什么呢?
Debug.WriteLine(GetStOfInt(c));
int d = c + 1;
Debug.WriteLine(GetStOfInt(d));
//有符号位的原码
return GetStOfInt(d);
}
}
}