如何获得C中int的二进制补码?
比如说我有一个像-254这样的int,我该如何将它转换为100000010?
有没有办法从整数变量中提取二进制补码值,因为我知道在C中,整数存储在二进制补偿中?
答案 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。