将超出范围的整数分配给有符号字符类型

Assigning an out-of-range integer to a signed char type

本文关键字:符号 字符 类型 分配 整数 范围      更新时间:2023-10-16

signed char a = 128;
假设一个字节是 8 位,这是未定义的吗?
我所知道的是,将超出范围的值分配给有符号类型是未定义的,但 Bjarne Stroustrup 用C++编程语言说,如果我将整数 255 分配给 char 在 char 有符号的 8 位字节机器上的 char,结果是 -1。

这是未定义的吗?

不。

我所知道的是,将超出范围的值分配给有符号类型是未定义的

也没有。

控制此规则的规则是整数类型之间的转换。转换是用于初始化还是赋值并不重要。

将整数值转换为有符号整数类型时, 如果结果不可表示,则:

当前标准C++17中:结果值将被实现定义。

即将推出的标准 C++20 中:该值将与原始值模 2 N 一致,其中N是目标类型的宽度(就像无符号整数一样(。 -1 与 255 模 28全等。


请注意,与转换不同,有符号算术溢出的行为是未定义的。

默认情况下,在 C 和 C++ 中,溢出/下溢操作的结果是未定义的。如果你溢出/下溢,会发生什么 有符号变量类型是 obsecure 这意味着它可能被包装(许多编译器都假设(或者可能转储核心或终止程序等。
但是编译器开发人员通常不严格遵循此定义,并且通常围绕这些内置类型

这是《C++编程语言》第4版Bjarne Stroustrup(第259页(中的一节

void f()
{
int i = 1;
while (0 < i) ++i;
cout << "i has become negative!" << i << 'n';
}
//This will (eventually) try to increase i past the largest integer. What happens then is undefined, but
//typically the value ‘‘wraps around’’ to a negative number (on my machine −2147483648).

这是GNU对此的看法

此外,将超出范围的值转换为 有符号整数类型。在这里,标准实现必须定义什么 发生,但这可能包括引发异常。在实践中 所有 在这种情况下,已知实现支持静默环绕,因此 不必担心其他可能性。 块引用

请查看这篇很棒的文章,看看其他基本程序如何依赖于未授权的签名溢出。