如何在C中获得两个int的补码?

时间:2016-03-16 06:25:06

标签: c

如何获得C中int的二进制补码?

比如说我有一个像-254这样的int,我该如何将它转换为100000010?

有没有办法从整数变量中提取二进制补码值,因为我知道在C中,整数存储在二进制补偿中?

4 个答案:

答案 0 :(得分:4)

  

知道在C中,整数存储在两个comp

不保证,但实际上每台计算机都使用两个补充。

  

有没有办法从整数变量

中提取出2的补码值

它已经采用了两种补码形式,所以目前还不清楚你在问什么。您似乎在问如何以二进制格式打印变量?

int data = -254;
const size_t BITS = 8*sizeof(data);
char bin_str[BITS+1];

for(unsigned int i=0; i<BITS; i++)
{
  unsigned int mask = 1u << (BITS - 1 - i);
  bin_str[i] = (data & mask) ? '1' : '0';
}
bin_str[BITS] = '\0';

答案 1 :(得分:1)

如果您在unsigned int s上运行,则可以反转位~并添加1以产生2s补码值。 x=(~y)+1;如果你的机器使用2s comp。 signed int的表示,然后这应该(通过实现的定义)转换为正确的signed int值。

C语言本身在这方面的保证有点模糊。要在对象的按位表示上移植,您应该使用unsigned类型。

答案 2 :(得分:-1)

如果数字为负数,您可以通过从0x80000000中减去数字,将有符号幅度转换为二进制补码。这将适用于使用2的补码表示负值的机器上的32位整数,但如果该值为正,则将导致2的补码否定。两个补码负数的右移将在一个时间内移动,我们可以利用它来制作一个掩码来在原始值之间进行选择,或者将有符号幅度的负值转换为两个&。 #39;补充负值。

int sm2tc(int x) {
  int m = x >> 31;
  return (~m & x) | (((x & 0x80000000) - x) & m);
}

原始代码由 Apriori

发布

答案 3 :(得分:-2)

实际上,有一种简单的方法可以做到这一点。只需将您的数字转换为二进制字符串,然后将该字符串转换回整数。

使用itoa,它以字符串形式将数字转换为给定的基数。

http://www.cplusplus.com/reference/cstdlib/itoa/

然后,只需使用熟悉的atoi将其转换回int。