将大于INT_MAX的数字分配给int时会发生什么?

时间:2016-02-23 04:57:51

标签: c++

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

3 个答案:

答案 0 :(得分:4)

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

因此,请参阅该文档以获得答案。

实现定义它的一种常见方法是将输入整数截断为$(document).ready(function(){ var a=window.screen.availWidth; var b=(0.20 * window.screen.availHeight); var c=(0.60 * window.screen.availHeight); $("#header").css("background-color","#009acd"); $("#header").css("height",b); $("#header").css("width",a); $("#header").css("position","relative"); $("#wrapper").css("background-color","#FFFFFF"); $("#wrapper").css("width",a); $("#wrapper").css("height",c); $("#wrapper").css("position","relative"); $("#logo1").css("position", "absolute"); $('#logo1').css("top","5%"); $('#d11').css("position","absolute"); $('#d11').css("top","75px"); $('#d11').css("left","310px"); $('#d11').css("color","#FFFFFF"); $('#marquee').css("position","absolute"); $('#marquee').css("top","-15px"); $('#marquee').css("left","300px"); $('#marquee').css("color","#FFFFFF"); $('h1').css("color","#FFFFFF"); $('h3').css("position","absolute"); $('h3').css("top","90px"); $('h3').css("left","1000px"); $('h3').css("color","#FFFFFF"); $('h2').css("position","absolute"); $('h2').css("top","60px"); $('h2').css("left","1075px"); $('h2').css("color","#FFFFFF"); /* $('#d12').css("position","absolute"); $('#d12').css("top","65px"); $('#d12').css("left","950px"); $('#d12').css("color","#FFFFFF");*/ $('#css3menu1').css("position", "absolute"); $('#css3menu1').css("bottom","17px"); $('#css3menu1').css("left","310px"); $('#videos').css("position", "absolute"); $('#videos').css("top","0px"); $('#videos').css("left","22px"); $('#studymaterial1').css("position", "absolute"); $('#studymaterial1').css("top","148px"); $('#studymaterial1').css("left","32px"); $('#downloads').css("position", "absolute"); $('#downloads').css("top","315px"); $('#downloads').css("left","22px"); $('#wowslider-container1').css("left","233px"); $('#wowslider-container1').css("top","1000px"); $('.formoid-solid-blue').css("position","absolute"); $('.formoid-solid-blue').css("left","912px"); $('.formoid-solid-blue').css("top","12px"); }); 的位数(如果需要,在重新解释unsigned as signed之后)。

C ++ 14标准参考:[expr.ass] / 3,[conv.integral] / 3

答案 1 :(得分:1)

在C ++ 20中,此行为仍然是实现定义的 1 ,但要求比以前要强得多。这是requiremenet在C ++ 20中对有符号整数类型使用two's complement表示形式的附带结果。

这种转换由[conv.integral]指定:

  
      
  1. 可以将整数类型的prvalue转换为另一种整数类型的prvalue。 [...]

  2.   
  3. [...]

  4.   
  5. 否则,结果将是目标类型的唯一值,该唯一值与源整数模2 N 一致,其中N是目标类型的宽度。

  6.   
  7. [...]

  8.   

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

int32_t u = 0x6881736df7939752;

...将保留32个最右边的位,即0xf7939752,并将这些位“复制”到u。用二进制补码表示,对应于-141322414

1 这仍然是实现定义的,因为int的大小是实现定义的。如果您指定给int32_t,则行为已完全定义。


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

  
      
  1. 整数类型的prvalue可以转换为另一种整数类型的prvalue。 [...]
  2.   
  3. 如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 n ,其中n是用于表示无符号类型的位数)。 [...]
  4.   
  5. 如果目标类型是带符号的,则该值可以在目标类型中表示,则该值保持不变;否则,该值是实现定义的。
  6.   

答案 2 :(得分:0)

32位系统上的int max是2,147,483,647(2 ^ 31 -1),unsigned它是(2 ^ 32 -1)4,294,967,295

int thing = 21474836470;

未指定的是什么,取决于编译器。我似乎截断了更高的位。 21474836470是0x4fffffff6,

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