假设我将一个十一位数分配给一个int,会发生什么?我玩了一下它,我知道它在int范围内给了我一些其他数字。这个新号码是如何创建的?
答案 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]指定:
可以将整数类型的prvalue转换为另一种整数类型的prvalue。 [...]
[...]
否则,结果将是目标类型的唯一值,该唯一值与源整数模2 N 一致,其中N是目标类型的宽度。
[...]
此行为与将数字的表示形式截断为要分配给的整数类型的宽度相同,例如:
int32_t u = 0x6881736df7939752;
...将保留32个最右边的位,即0xf7939752
,并将这些位“复制”到u
。用二进制补码表示,对应于-141322414
。
1 这仍然是实现定义的,因为int
的大小是实现定义的。如果您指定给int32_t
,则行为已完全定义。
在C ++ 20之前,无符号和有符号类型有两种不同的规则:
- 整数类型的prvalue可以转换为另一种整数类型的prvalue。 [...]
- 如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 n ,其中n是用于表示无符号类型的位数)。 [...]
- 如果目标类型是带符号的,则该值可以在目标类型中表示,则该值保持不变;否则,该值是实现定义的。
答案 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;