почему то не работает вот такая функция преобразования из дополнительного кода в прямой после первой строки if сразу летит на return, хотя на вход я подаю число, например 0xD500. У меня это -2.5. То есть число в дополнительном коде. Старший бит - это знак. Поскольку минус, он равен 1.
unsigned int abs_int(int sgnval) { if (sgnval&0x8000==0x8000) //если старший бит =1, то число отрицательное, следовательно записано в дополнительном коде { sgnval -= 0x0001; //отнять младшую 1
if (sgnval&0x0001==0x0001) sgnval=sgnval&0xFFFE; // 1111 1111 1111 1110 else sgnval=sgnval|0x0001; // 0000 0000 0000 0001 if (sgnval&0x0002==0x0002) sgnval=sgnval&0xFFFD; // 1111 1111 1111 1101 else sgnval=sgnval|0x0002; // 0000 0000 0000 0010 if (sgnval&0x0004==0x0004) sgnval=sgnval&0xFFFB; // 1111 1111 1111 1011 else sgnval=sgnval|0x0004; // 0000 0000 0000 1000 if (sgnval&0x0008==0x0008) sgnval=sgnval&0xFFF7; // 1111 1111 1111 0111 else sgnval=sgnval|0x0008; // 0000 0000 0000 1000
if (sgnval&0x0010==0x0010) sgnval=sgnval&0xFFEF; // 1111 1111 1110 1111 else sgnval=sgnval|0x0010; // 0000 0000 0001 0000 if (sgnval&0x0020==0x0020) sgnval=sgnval&0xFFDF; // 1111 1111 1101 1111 else sgnval=sgnval|0x0020; // 0000 0000 0010 0000 if (sgnval&0x0040==0x0040) sgnval=sgnval&0xFFBF; // 1111 1111 1011 1111 else sgnval=sgnval|0x0040; // 0000 0000 1000 0000 if (sgnval&0x0080==0x0080) sgnval=sgnval&0xFF7F; // 1111 1111 0111 1111 else sgnval=sgnval|0x0080; // 0000 0000 1000 0000
if (sgnval&0x0100==0x0100) sgnval=sgnval&0xFEFF; else sgnval=sgnval|0x0100; if (sgnval&0x0200==0x0200) sgnval=sgnval&0xFDFF; else sgnval=sgnval|0x0200; if (sgnval&0x0400==0x0400) sgnval=sgnval&0xFBFF; else sgnval=sgnval|0x0400; if (sgnval&0x0800==0x0800) sgnval=sgnval&0xF7FF; else sgnval=sgnval|0x0800;
if (sgnval&0x1000==0x1000) sgnval=sgnval&0xEFFF; else sgnval=sgnval|0x1000; if (sgnval&0x2000==0x2000) sgnval=sgnval&0xDFFF; else sgnval=sgnval|0x2000; if (sgnval&0x4000==0x4000) sgnval=sgnval&0xBFFF; else sgnval=sgnval|0x4000; if (sgnval&0x8000==0x8000) sgnval=sgnval&0x7FFF; else sgnval=sgnval|0x8000; } return sgnval; }
с чем может быть связано?
|