在C++标准中,是否未对一个有符号的Var进行超出范围的赋值?

问题描述 投票:0回答:1

我一直在看C++ Primer,它说如果我给一个有符号的var赋一个超出范围的值会使这个var未定义,但是在Visual C++编译器中实验的结果是和无符号的var一样,会在二进制中掉较高的位数,这是C++标准中的功能吗?Visual C++把它打破了?

c++ visual-c++
1个回答
0
投票

C++17[conv.integration]中定义了积分转换的行为。

如果目标类型是有符号的,如果它能用目标类型表示,那么它的值就不会改变;否则,它的值是由实现定义的,没有未定义的行为。

不存在未定义的行为。此外,实验的结果永远不能告诉你任何事情,因为你不知道你看到的是否是未定义的行为。唯一可靠的方法是检查标准。如果标准说 "实现定义",那么你就检查你的编译器的文档,看看定义是什么。


这在C++20中可能会改变,最新的标准草案的新文本是。

结果是目标类型的唯一值 与源整数模数2一致。N ,其中N是目标类型的宽度。

这是 "在2的补码表示中丢弃高位 "的形式语言。

© www.soinside.com 2019 - 2024. All rights reserved.