C++ 在C+中从有符号整数到无符号整数,反之亦然+;20

C++ 在C+中从有符号整数到无符号整数,反之亦然+;20,c++,language-lawyer,signed,twos-complement,c++20,C++,Language Lawyer,Signed,Twos Complement,C++20,在C++之前,20个有符号整数不能保证是2的补码。现在我们有两篇论文建议将两个补码的标准化作为唯一的表示:而且,如果我理解正确的话,其中一篇被合并到C++20工作草案中 那么,有符号到无符号的转换以及无符号到有符号的转换意味着什么呢?我查看并发现以下措辞: 如果目标类型是无符号的,则结果值是最小的无符号值,等于源值模2n 其中n是用于表示目标类型的位数 如果目标类型是有符号的,则如果源整数可以在目标类型中表示,则该值不会更改。否则,结果是目标类型的唯一值等于源值模2n 其中n是用于表示目标类型的

在C++之前,20个有符号整数不能保证是2的补码。现在我们有两篇论文建议将两个补码的标准化作为唯一的表示:而且,如果我理解正确的话,其中一篇被合并到C++20工作草案中

那么,有符号到无符号的转换以及无符号到有符号的转换意味着什么呢?我查看并发现以下措辞:

如果目标类型是无符号的,则结果值是最小的无符号值,等于源值模
2n
其中
n
是用于表示目标类型的位数

如果目标类型是有符号的,则如果源整数可以在目标类型中表示,则该值不会更改。否则,结果是目标类型的唯一值等于源值模
2n
其中
n
是用于表示目标类型的位数。(请注意,这与未定义的有符号整数算术溢出不同)

不幸的是,我在理解这个措辞时遇到了问题,我想知道C++20工作草案中写了什么

因此有两个问题:

  • 语言律师部分:有人能指出标准到底说了什么,以及标准在哪里说的吗

  • 有人能用更通俗的语言来解释这句话吗?也许还可以解释模运算并提供例子

  • 转换规则为:

    否则,结果是目标类型的唯一值,该值与源整数模一致
    2N
    ,其中
    N
    是目标类型的范围指数

    其中范围指数如表中所述,但表示您期望的值(对于
    int
    至少为16,对于
    long
    ,至少为64,以此类推)

    例如,将值为
    -3
    short
    转换为
    无符号short
    是为了找到类型
    无符号short
    的唯一值,该值与
    -3
    216
    一致。。。也就是说,
    216-3
    65533
    。但是将
    -3
    的相同
    short
    值转换为
    无符号long-long
    会将模基更改为
    264
    ,因此最终得到的是
    18446744073709551613


    从有符号类型转换为具有不同范围指数的有符号类型(或类似地,从无符号转换为无符号)更为简单-您可以将位切掉或进行零扩展。例如,将值为258的
    short
    转换为
    int
    long
    long
    仅为258,但转换为
    signed char
    则为2

    你的引用用了很多词来表达一件非常简单的事情:对于每个整数
    i
    ,在
    0
    M
    之间只有一个整数
    k
    ,因此
    i%M==k
    (在数学意义上,而不是“固定大小的整数表示法”意义上)。用更通俗的术语来说,
    i%M==k
    意味着“如果我从
    i
    中加上或减去
    M
    正确的次数,我可以获得
    k

    在整数转换的情况下,
    M=2^N
    其中
    N
    是目标类型中的位数。标准上说:

    否则,结果是目标类型的唯一值,该值与源整数模一致
    2^N
    ,其中
    N
    是目标类型的范围指数

    例如:

    假设目标类型有4位,因此它可以表示从
    0
    15
    2^4=16
    值。将
    1
    转换到此范围产生
    1
    14
    产生
    14
    15
    产生
    15
    16
    产生
    0
    17
    产生
    1
    18
    产生
    2
    ,依此类推。转换
    0
    产生
    0
    -1
    产生
    15
    -2
    产生
    14


    如果你真的想更深入地介绍模运算,这超出了本网站的范围。你应该参考网络上丰富的资源,比如。

    他们会放弃对不支持它的硬件的支持吗?这是很危险的,因为他们想要支持更多的嵌入式系统。他们还没有发现任何硬件不是二元的补充,并支持现代C++。当他们授权两个对签名数字的补充时,签名的上/下流仍然是未定义的行为,所以我不期望对我的代码有任何实际影响。