负零整数

Negative zero int

我需要一个整数向量,我可以在其中区分 0 和 -0。 到目前为止,我已经想出了为这种特殊情况定义一个名为 zero_int 的新 class 的想法..

但是,现在我无法将普通整数和 zero_int 推入同一个向量中。 解决方案 std::variant 的大小为 8 个字节,我需要为每个变量保留 4 个字节的大小。 定义一个虚拟基础 class my_int 并将 zero_int 设置为其派生 class 会将 zero_int 的大小增加到 32 字节...

我知道可以使用 vector<void*> 之类的东西,但我不知道如何使用.. - 另外,指针指向的对象是否在内存中连续的指针向量中? - 这在这种情况下很重要。

如果有任何关于如何解决此问题的建议,我将不胜感激

The solution std::variant has the size of 8 Bytes and I need to retain the size of 4 per variable..

这是不可能的,除非您不介意失去一个可能的非零 int 值。

这将我们引向 "obvious" 解决方案:将 0 视为 -0,并将每个正数视为其自身减一。

    vec[i]:  -5 -4 -3 -2 -1  0 +1 +2 +3 +4 +5
my "value":  -5 -4 -3 -2 -1 -0 +0 +1 +2 +3 +4

(或者反过来,这会让你在正负范围内对称;随你喜欢。)

让任何 class 包装你的矢量处理这个 "mapping" 以适合你的项目的任何方式。


are objects pointed to by the pointers in a vector of pointers contiguous in memory??

没有

你不想在这里有更多的间接性。


有人会建议使用浮点数,因为 IEEE 754 支持有符号零。但是,我认为在任何情况下切换到浮点数来表示实数可能会引入比它解决的问题更多的问题。

我会考虑使用无符号类型并将最高位显式管理为符号位:

class my_int {
public:
    my_int(int v) { set(v); }
    explicit operator int() const { return get(); }
    bool is_negative() const { return value & sign_bit; }
private:
    const static unsigned sign_bit =
        1u << (std::numeric_limits<unsigned>::digits - 1);
    unsigned value;
    void set(int v) { value = v < 0 ? (-v) & sign_bit : v;
    }
    int get() const { return value & sign_bit ? -(value & ~sign_bit) : value; }
};

注意:已写但未经测试。