C++ 在C+中从有符号整数到无符号整数,反之亦然+;20
在C++之前,20个有符号整数不能保证是2的补码。现在我们有两篇论文建议将两个补码的标准化作为唯一的表示:而且,如果我理解正确的话,其中一篇被合并到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是用于表示目标类型的
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++。当他们授权两个对签名数字的补充时,签名的上/下流仍然是未定义的行为,所以我不期望对我的代码有任何实际影响。