繁体   English   中英

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

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

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

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

默认情况下,在 C 和 C++ 中,上溢/下溢操作的结果是UNDEFINED 如果您溢出/下溢签名变量类型是 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所说的

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

请查看这篇精彩的文章,了解其他基本程序如何依赖未经授权的签名溢出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM