将超出范围的整数分配给有符号字符类型
Assigning an out-of-range integer to a signed char type
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对此的看法
此外,将超出范围的值转换为 有符号整数类型。在这里,标准实现必须定义什么 发生,但这可能包括引发异常。在实践中 所有 在这种情况下,已知实现支持静默环绕,因此 不必担心其他可能性。 块引用
请查看这篇很棒的文章,看看其他基本程序如何依赖于未授权的签名溢出。
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 将超出范围的整数分配给有符号字符类型
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 库特无符号字符
- 寻找一种更好的方法来表示无符号字符数组
- C++ 无符号字符 *{varName};-> C#
- 如何返回/复制unique_ptr<无符号字符[]>的值?
- 将浮点数转换为无符号字符数组并打印出来
- 在函数中返回无符号字符数组,但不返回指针
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 无符号字符打印其 ASCII 值
- 字符数组到无符号字符 *