Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当我将大于INT_MAX的数字分配给INT时会发生什么?_C++ - Fatal编程技术网

C++ 当我将大于INT_MAX的数字分配给INT时会发生什么?

C++ 当我将大于INT_MAX的数字分配给INT时会发生什么?,c++,C++,假设我给一个整数分配一个11位数字,会发生什么?我玩了一下,我知道它给了我一些int范围内的其他数字。这个新数字是如何创建的?它是实现定义的行为。这意味着您的编译器必须提供说明此场景中发生的情况的文档 因此,请查阅该文档以获得您的答案 实现定义它的一种常见方法是将输入整数截断为int的位数(必要时将unsigned重新解释为signed) 32位系统上的C++14标准参考[expr.ass]/3[conv.integral]/3INT\u MAX是2147483647(231−1) ,UINT_

假设我给一个整数分配一个11位数字,会发生什么?我玩了一下,我知道它给了我一些int范围内的其他数字。这个新数字是如何创建的?

它是实现定义的行为。这意味着您的编译器必须提供说明此场景中发生的情况的文档

因此,请查阅该文档以获得您的答案

实现定义它的一种常见方法是将输入整数截断为
int
的位数(必要时将unsigned重新解释为signed)


32位系统上的C++14标准参考[expr.ass]/3[conv.integral]/3

INT\u MAX
是2147483647(231−1) ,
UINT_MAX
是4294967295(232−1)

发生的事情是实现定义的,这取决于编译器。我的似乎截断了较高的位。21474836470是0x4FFFFF6

warning: implicit conversion from 'long' to 'int' changes
  value from 21474836470 to -10 [-Wconstant-conversion]
int thing = 21474836470;

在C++20中,这种行为仍然是由实现定义的,但要求比以前强烈得多。这是requiremenet对C++20中的有符号整数类型使用表示的一个附带结果

此类转换由以下内容指定:

  • 整数类型的prvalue可以转换为另一个整数类型的prvalue。[……]

  • [……]

  • 否则,结果是与源整数模2N全等的目标类型的唯一值,其中N是目标类型的宽度

  • [……]

  • 此行为与将数字表示形式截断为指定给的整数类型的宽度相同,例如:

    int32_t u = 0x6881736df7939752;
    
    
    …将保留最右边的32位,即
    0xf7939752
    ,并将这些位“复制”到
    u
    。在二的补码中,这对应于
    -141322414

    1这仍然是实现定义的,因为
    int
    的大小是实现定义的。如果分配给,例如,
    int32\u t
    ,则行为已完全定义


    在C++20之前,对于无符号和有符号类型有两种不同的规则:

  • 整数类型的prvalue可以转换为另一个整数类型的prvalue。[……]
  • 如果目标类型是无符号的,则结果值是与源整数全等的最小无符号整数(模2n,其中n是用于表示无符号类型的位数)。[……]
  • 如果目的地类型是有符号的,如果可以在目的地类型中表示,则该值不变;否则,该值由实现定义

  • 尝试将输入和输出值转换为二进制或十六进制。这会让你对正在发生的事情有一个很好的了解。我很好奇,对于(有符号的)积分赋值,它具体是在哪里说的,而不仅仅是初始化?我知道这种行为可以在积分转换中找到,但我找不到它说的那些用于赋值的地方。啊哈![conv]/4和[conv]/6.@chris see[expr.ass]/3,它说赋值会导致对左操作数类型的隐式转换(对于非类类型)哇,我读了三遍,没有注意到。我知道还剩下那块不见的东西。感谢您填写。它的实现定义;这与“未指定”不同,因为编译器必须记录行为。@M.M我冒昧地稍微整理了一下答案。
    int32_t u = 0x6881736df7939752;