使用位掩码将有符号整数转换为二进制补码

时间:2014-10-19 15:11:28

标签: c

我被赋予此代码将有符号整数转换为二进制补码,但我不明白它是如何工作的,特别是如果输入为负数。

void convertB2T( int32_t num) {

    uint8_t bInt[32];
    int32_t mask = 0x01;
    for (int position = 0; position < NUM_BITS; position++) {
        bInt[position] = ( num & Mask) ? 1 : 0;        
        Mask = Mask << 1;
    }
}

所以我的问题是:

  1. num是一个整数,Mask是十六进制,所以num&amp;面膜工作? C只是将num转换为二进制表示并按位进行吗? Mask的输出也是整数正确吗?因此,如果此输出为非零,则将其视为TRUE,如果为零,则为FALSE,对吗?

  2. 如果num为负,这如何工作?我尝试运行代码并且实际上没有得到正确的答案(所有更高级别的位都是1)。

2 个答案:

答案 0 :(得分:0)

该程序基本上提取数字的每一位并将其放入向量中。所以每一位都成为一个向量元素。它与二进制补码转换无关(尽管得到的位向量将是二进制补码,因为数字的内部表示是二进制补码)。

  1. 计算机不知道hex意味着什么。每个值都以二进制形式存储,因为二进制是计算机唯一理解的东西。因此,“整数”和十六进制值被转换为二进制(十六进制也有一个整数)。在计算机使用的这些二进制表示中,应用了二元运算符。

  2. 为了理解当num为负时结果发生了什么,你需要理解结果基本上是num的二进制补码表示,你需要知道二进制补码表示是如何工作的。 Wikipedia是一个很好的起点。

答案 1 :(得分:0)

回答你的问题

1.Yes num是以decimal格式表示的整数,mask也是以hex格式表示的整数。 是C编译器将nummask与其二进制等价物区分开来。

num = 24; // binary value on 32 bit machine is 000000000000000000011000
mask = 0x01; // binary value on 32 bit machine is 000000000000000000000001 

是编译器现在按位执行&和等效的二进制值。

如果输出非零,则为是,视为真

  1. 如果数字为负数,则以2的补码形式表示。
  2. 基本上,您的代码只是将二进制等效数字存储到array中。你没有代表两个补充。

    如果MSB为1则表示数字为负数。如果数字为负数

    num = -24; // represent binary value of 24 
    000000000000000000011000 -> apply 1's complement + 1 to this binary value
    
     111111111111111111100111 -> 1's complement
    +000000000000000000000001 -> add 1
     ------------------------
     111111111111111111101000 -> -24 representation
     ------------------------