C++ 当我将大于INT_MAX的数字分配给INT时会发生什么?
假设我给一个整数分配一个11位数字,会发生什么?我玩了一下,我知道它给了我一些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_
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中的有符号整数类型使用表示的一个附带结果 此类转换由以下内容指定:
int32_t u = 0x6881736df7939752;
…将保留最右边的32位,即0xf7939752
,并将这些位“复制”到u
。在二的补码中,这对应于-141322414
1这仍然是实现定义的,因为int
的大小是实现定义的。如果分配给,例如,int32\u t
,则行为已完全定义
在C++20之前,对于无符号和有符号类型有两种不同的规则:
尝试将输入和输出值转换为二进制或十六进制。这会让你对正在发生的事情有一个很好的了解。我很好奇,对于(有符号的)积分赋值,它具体是在哪里说的,而不仅仅是初始化?我知道这种行为可以在积分转换中找到,但我找不到它说的那些用于赋值的地方。啊哈![conv]/4和[conv]/6.@chris see[expr.ass]/3,它说赋值会导致对左操作数类型的隐式转换(对于非类类型)哇,我读了三遍,没有注意到。我知道还剩下那块不见的东西。感谢您填写。它的实现定义;这与“未指定”不同,因为编译器必须记录行为。@M.M我冒昧地稍微整理了一下答案。
int32_t u = 0x6881736df7939752;