C程序中~0 = -1且~1 = -2

时间:2014-10-24 02:46:07

标签: c

我有一个uint8_t类型的数组,存储0和1。当我对每个元素进行否定时,我得到一个-1和-2的数组。这怎么可能?如何让它按照预期的方式运行?

2 个答案:

答案 0 :(得分:3)

它实际上正在做正确的事情,但它只是被错误地显示出来。负数用二进制补码表示。要将数字转换为否定数,请执行以下操作:NOT(positive) + 1

例如,要将2转换为负数:

  1. +2 = 00000010
  2. not(+2) = 11111101
  3. not(+2) + 1 = 11111110
  4. 这意味着-2由二进制的11111110表示。注意这实际上是+1的位逆,即00000001。这就解释了为什么你会看到自己的样子,但为什么它没有向你显示出预期的积极态度呢?这取决于您如何显示它。您最有可能使用printf或类似的字符串格式化程序而不是%i,因此编译器会自动为您投射它。如果您更改格式,则应该修复它。

    如果您只想在%utrue之间进行更改,请使用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。