我如何从符号大小转换为2的补码我不知道从哪里开始任何帮助都将不胜感激。
我只能使用以下操作:!,~,|,&,^,+,>>,<
/*
* sm2tc - Convert from sign-magnitude to two's complement
* where the MSB is the sign bit
* Example: sm2tc(0x80000005) = -5.
*
*/
int sm2tc(int x) {
return 2;
}
最佳答案
如果数字为负数,则可以通过从0x8000000中减去该数字,将有符号大小转换为2的补码。对于机器上的32位整数,这将使用two的补码来表示负值,但如果该值为正值,则将导致two的补码为负值。一个二补负数的右移将在一个二补负数中移动,我们可以利用这个做一个掩码,在原始值之间进行选择,或者将一个有符号的量值负值转换为二补负数。
int sm2tc(int x) {
int m = x >> 31;
return (~m & x) | (((x & 0x80000000) - x) & m);
}
关于c - 如何从符号幅度转换为二进制补码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21837008/