gpt4 book ai didi

c++ - int 值通常什么时候转换为 unsigned?

转载 作者:太空狗 更新时间:2023-10-29 20:37:54 25 4
gpt4 key购买 nike

这里来自 C++ Prime 5th:

if we use both unsigned and int values in an arithmetic expression, the int value ordinarily is converted to unsigned.

我尝试了以下代码:

int i = -40;
unsigned u = 42;
unsigned i2 = i;
std::cout << i2 << std::endl; // 4294967256
std::cout << i + u << std::endl; // 2

对于i + u,如果i转换为unsigned,则为4294967256,然后i + u 不能等于 2

如果我们在算术表达式中同时使用 unsignedint 值,int 值是否总是转换为 unsigned

最佳答案

是的。

您遇到的是整数溢出。负数的符号由前导符号位给出,它是 0(正)或 1(负)。然而,对于无符号整数,这个前导位只是给你多了一位整数精度,而不是符号指示。 “负”有符号数最终从最大无符号整数大小开始倒数。

这与您的特定代码有什么关系?嗯,-40 确实变成了 4294967256。但是,4294967256+42 不能放入无符号整数,就好像你记得 -40 只是变成了最大无符号整数负 39。所以通过添加 42,你超过了容量你的数据类型。可能的第 33 位被砍掉了,你从 0 重新开始。因此,你仍然得到 2 作为答案。

Signed:             -42,        -41, ...,         -1, 0, 1, 2
Unsigned: 4294967256, 4294967257, ..., 4294967295, 0, 1, 2, ...
^--^ Overflow!

您可能有兴趣阅读有关 Two's Complement 的内容

关于c++ - int 值通常什么时候转换为 unsigned?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33337808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com