我有一个uint8_t类型的数组,存储0和1。当我对每个元素进行否定时,我得到一个-1和-2的数组。这怎么可能?如何让它按照预期的方式运行?
答案 0 :(得分:3)
它实际上正在做正确的事情,但它只是被错误地显示出来。负数用二进制补码表示。要将数字转换为否定数,请执行以下操作:NOT(positive) + 1
。
例如,要将2转换为负数:
+2 = 00000010
not(+2) = 11111101
not(+2) + 1 = 11111110
这意味着-2
由二进制的11111110
表示。注意这实际上是+1
的位逆,即00000001
。这就解释了为什么你会看到自己的样子,但为什么它没有向你显示出预期的积极态度呢?这取决于您如何显示它。您最有可能使用printf
或类似的字符串格式化程序而不是%i
,因此编译器会自动为您投射它。如果您更改格式,则应该修复它。
如果您只想在%u
和true
之间进行更改,请使用false
代替!
。
答案 1 :(得分:0)
如果我记得,~
运算符会翻转所有位。对于signed char整数,以上是正确的。例如,对于signed char,0 = 00000000,1 = 00000001,-1 = 11111111,-2 = 11111110。
如果你想要" true"和"假",通常假是全位零(= 0)和"真"是all-bits-1(= -1)。然后,~true == false和~false == true。
如果要在0和1之间切换,可以使用xor运算符^
来切换特定位;在这种情况下,您希望切换最低位,因此请使用^1
。 0 ^ 1 == 1和1 ^ 1 == 0。