无符号int无法使用C ++

时间:2015-07-17 06:05:18

标签: c++ c++11 casting unsigned-integer

以下是使用具有相应输出的unsigned int的不同程序/方案。我不知道为什么有些人没有按预期工作。

预期产出:2

计划1

int main()
{
    int value = -2;
    std::cout << (unsigned int)value;

    return 0;
}

// OUTPUT: 4294967294

计划2

int main()
{
    int value;
    value = -2;
    std::cout << (unsigned int)value;

    return 0;
}

// OUTPUT: 4294967294

计划3

int main()
{
    int value;
    std::cin >> value; // 2
    std::cout << (unsigned int)value;

    return 0;
}

// OUTPUT: 2

有人可以解释为什么计划1和计划2不起作用吗?对不起,我是编码新手。

2 个答案:

答案 0 :(得分:2)

您期望从intunsigned int的演员表只需更改负值的符号,同时保持其幅度。但这不是它在C或C ++中的工作方式。当涉及到溢出时,无符号整数遵循模运算,这意味着从负数值(例如-1或-2)分配或初始化包围最大和第二大无符号值,依此类推。因此,例如,这两个是等价的:

unsigned int n = -1;
unsigned int m = -2;

unsigned int n = std::numeric_limits<unsigned int>::max();
unsigned int m = std::numeric_limits<unsigned int>::max() - 1;

请参阅this working example

另请注意,程序1和2之间没有实质性区别。这一切都是用于初始化或分配给无符号整数的值的符号。

答案 1 :(得分:0)

将值从有符号转换为无符号会更改如何解释值的单个位。让我们看一个像charunsigned char这样的8位值的简单示例。

字符值的值范围为-128到127.包括0这些值是256(2 ^ 8)个值。通常第一位表示该值为负或正。因此,只有最后7位可用于描述实际值。

无符号字符不能取任何负值,因为没有位可以确定该值应为负值还是正值。因此,其值范围为0到256.

当所有位都置位(1111 1111)时,无符号字符的值为256.但是,简单字符值会将第一位视为负值的指示符。坚持two's complement此值将为-1。

这就是intunsigned int的演员阵容不符合您的预期,但它完全符合预期。

修改

如果您只想从负值切换为正值,请自行编写一个类似

的简单函数
uint32_t makeUnsigned(int32_t toCast)
{
    if (toCast < 0)
        toCast *= -1;
    return static_cast<uint32_t>(toCast);
}

这样您就可以将传入的int转换为unsigned int,其最大值为2^32 - 1