Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 转换两个';符号量补_C_Twos Complement - Fatal编程技术网

C 转换两个';符号量补

C 转换两个';符号量补,c,twos-complement,C,Twos Complement,我只需要使用运算符,将2的补码转换为C中的符号大小 ! ~ & ^ | + << >> 有什么建议吗?当你从2补码转换成时,你应该减去1,而不是相加 我不完全确定输出应该是什么,但要获得大小,可以这样做: int m = (a^(a>>31)) + sign; 基本上,将负数31位向右移位将使其全部为1,或0xffffffff,然后可以使用它对输入数进行异或运算,使其为正数。正如您正确指出的,在这种情况下,需要添加符号,以获得正确的结果 如果输入的

我只需要使用运算符,将2的补码转换为C中的符号大小

! ~ & ^ | + << >>

有什么建议吗?

当你从2补码转换成时,你应该减去1,而不是相加

我不完全确定输出应该是什么,但要获得大小,可以这样做:

int m = (a^(a>>31)) + sign;
基本上,将负数31位向右移位将使其全部为1,或
0xffffffff
,然后可以使用它对输入数进行异或运算,使其为正数。正如您正确指出的,在这种情况下,需要添加符号,以获得正确的结果


如果输入的数字一开始是正的,那么移位的结果是零,所以异或什么也不做。在这种情况下,添加
符号也没有任何作用,因此它会导致输入数字。

要获得最后一位,可以使用掩码操作

   int last_bit = 32 bit integer & 0x80000000 
   o/p  may be 0 or 0x80000000    
如果是
0
,只需显示给定的数字,否则必须执行以下操作以符号量表示

1)从数字中减去1

2)对结果执行1s补码(即否定
~

3)设置结果数的最后一位

 I mean  ( ~ (num -`1) ) | 0x7fffffff 
由于您被限制不使用
-
运算符。对-1执行
2的补码,并将其添加到
num

To put it simple in one line
 num & 0x80000000 ? printf("%d",(~(num+((~1)+1))) | 0x7fffffff) : printf("%d",num)   ;

给出绝对值(大小)。如果您希望将符号位添加回,只需掩码和/或第32位:

unsigned int s_M = r | (v & 0x80000000);
或者,如果您正在寻找一个班轮:

unsigned int s_M = ((v + (v >> 31)) ^ (v >> 31)) | (v & 0x80000000);

欢迎来到SO。您可以使用代码格式和反勾号来设置代码格式,以便于阅读。您可以使用三元运算符吗?这就是问题所在,我不能。这就是为什么这件事很棘手的原因,我必须利用我的现有资源。我不能在
int const mask=v>>31中使用&&或| just&或| Why
const
?问题是如果我有数字0x80000001,它应该被转换成-1,而不是-2147483647。@chux我从Bit Twiddling Hacks链接中得到了它。通过使某些内容保持常量,我认为它可能有助于编译器进行某些优化,尽管我真的不确定。@2的补码中的user2938343(-1)是0xFFFFFF,而不是0x8000001(-2147483647)。如果在转换器中使用-1,则会得到0x80000001,因为设置了第32位(-sign),并且您的值为1。除非我误解了你的问题。。。
unsigned int s_M = r | (v & 0x80000000);
unsigned int s_M = ((v + (v >> 31)) ^ (v >> 31)) | (v & 0x80000000);