How does one safely static_cast between unsigned int and int?

后端 未结 6 1273
猫巷女王i
猫巷女王i 2021-02-19 19:36

I have an 8-character string representing a hexadecimal number and I need to convert it to an int. This conversion has to preserve the bit pattern for

6条回答
  •  庸人自扰
    2021-02-19 20:06

    You can negate an unsigned twos-complement number by taking the complement and adding one. So let's do that for negatives:

    if (val < 0x80000000) // positive values need no conversion
      return val;
    if (val == 0x80000000) // Complement-and-addition will overflow, so special case this
      return -0x80000000; // aka INT_MIN
    else
      return -(int)(~val + 1);
    

    This assumes that your ints are represented with 32-bit twos-complement representation (or have similar range). It does not rely on any undefined behavior related to signed integer overflow (note that the behavior of unsigned integer overflow is well-defined - although that should not happen here either!).

    Note that if your ints are not 32-bit, things get more complex. You may need to use something like ~(~0U >> 1) instead of 0x80000000. Further, if your ints are no twos-complement, you may have overflow issues on certain values (for example, on a ones-complement machine, -0x80000000 cannot be represented in a 32-bit signed integer). However, non-twos-complement machines are very rare today, so this is unlikely to be a problem.

提交回复
热议问题