我一直在看C++ Primer,它说如果我给一个有符号的var赋一个超出范围的值会使这个var未定义,但是在Visual C++编译器中实验的结果是和无符号的var一样,会在二进制中掉较高的位数,这是C++标准中的功能吗?Visual C++把它打破了?
C++17[conv.integration]中定义了积分转换的行为。
如果目标类型是有符号的,如果它能用目标类型表示,那么它的值就不会改变;否则,它的值是由实现定义的,没有未定义的行为。
不存在未定义的行为。此外,实验的结果永远不能告诉你任何事情,因为你不知道你看到的是否是未定义的行为。唯一可靠的方法是检查标准。如果标准说 "实现定义",那么你就检查你的编译器的文档,看看定义是什么。
这在C++20中可能会改变,最新的标准草案的新文本是。
结果是目标类型的唯一值 与源整数模数2一致。N ,其中N是目标类型的宽度。
这是 "在2的补码表示中丢弃高位 "的形式语言。