我被赋予此代码将有符号整数转换为二进制补码,但我不明白它是如何工作的,特别是如果输入为负数。
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;
}
}
所以我的问题是:
num是一个整数,Mask是十六进制,所以num&amp;面膜工作? C只是将num转换为二进制表示并按位进行吗? Mask的输出也是整数正确吗?因此,如果此输出为非零,则将其视为TRUE,如果为零,则为FALSE,对吗?
如果num为负,这如何工作?我尝试运行代码并且实际上没有得到正确的答案(所有更高级别的位都是1)。
答案 0 :(得分:0)
该程序基本上提取数字的每一位并将其放入向量中。所以每一位都成为一个向量元素。它与二进制补码转换无关(尽管得到的位向量将是二进制补码,因为数字的内部表示是二进制补码)。
计算机不知道hex意味着什么。每个值都以二进制形式存储,因为二进制是计算机唯一理解的东西。因此,“整数”和十六进制值被转换为二进制(十六进制也有一个整数)。在计算机使用的这些二进制表示中,应用了二元运算符。
为了理解当num为负时结果发生了什么,你需要理解结果基本上是num的二进制补码表示,你需要知道二进制补码表示是如何工作的。 Wikipedia是一个很好的起点。
答案 1 :(得分:0)
回答你的问题
1.Yes num是以decimal
格式表示的整数,mask也是以hex
格式表示的整数。
是C编译器将num
和mask
与其二进制等价物区分开来。
说
num = 24; // binary value on 32 bit machine is 000000000000000000011000
mask = 0x01; // binary value on 32 bit machine is 000000000000000000000001
是编译器现在按位执行&
和等效的二进制值。
如果输出非零,则为是,视为真
基本上,您的代码只是将二进制等效数字存储到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
------------------------