C++ 为什么可以';我使用';0x8000000';初始化int数组? #包括 int main() { int arr[1]={0x8000000}; std::cout

C++ 为什么可以';我使用';0x8000000';初始化int数组? #包括 int main() { int arr[1]={0x8000000}; std::cout,c++,arrays,initialization,int,list-initialization,C++,Arrays,Initialization,Int,List Initialization,因为在这里arr[0]=0x8000000;编译器执行强制转换(我们这里说的是int=32位),这是实现定义的(取决于编译器)。在某些编译器上也可能会收到警告 #include<iostream> int main() { int arr[1] = {0x80000000}; std::cout<<arr[0]<<"\n"; return 0; } 但是编译器在初始化时无法执行强制转换,因为它直接将数组映射到内存。0x8000000无

因为在这里
arr[0]=0x8000000;
编译器执行强制转换(我们这里说的是int=32位),这是实现定义的(取决于编译器)。在某些编译器上也可能会收到警告

#include<iostream>
int main()
{
    int arr[1] = {0x80000000};
    std::cout<<arr[0]<<"\n";
    return 0;
}

但是编译器在初始化时无法执行强制转换,因为它直接将数组映射到内存。

0x8000000
无法在此处容纳
int
,因此它是一个带有
无符号int
的类型。对于初始化,需要隐式转换,但除了赋值之外,隐式转换是有限的,即缩小范围在中禁止转换(从C++11开始):

#include<iostream>
int main()
{
    int arr[1] = {0x80000000};
    std::cout<<arr[0]<<"\n";
    return 0;
}
列表初始化通过禁止以下操作来限制允许的隐式转换:

#include<iostream>
int main()
{
    int arr[1] = {0x80000000};
    std::cout<<arr[0]<<"\n";
    return 0;
}
  • 从整数或无范围枚举类型转换为整数类型,该类型不能表示原始类型的所有值,除非源是常数表达式,其值可以精确存储在目标类型中
关于隐式转换的行为,即在赋值中:

#include<iostream>
int main()
{
    int arr[1] = {0x80000000};
    std::cout<<arr[0]<<"\n";
    return 0;
}
如果目标类型是有符号的,则如果源整数可以在目标类型中表示,则该值不会更改。否则,结果是实现定义的

#include<iostream>
int main()
{
    int arr[1] = {0x80000000};
    std::cout<<arr[0]<<"\n";
    return 0;
}
超出范围转换的行为是由实现定义的,例如,它可能根据表示规则(通常是2的补码)进行环绕。

它“工作不完美”。当您使用静默允许截断的构造时,它可能会编译,但这并不意味着不会发生截断。您仍然会得到错误的结果,因为您的值不适合
带符号的int
,在这种情况下,编译器无法帮助您发现错误

#include<iostream>
int main()
{
    int arr[1] = {0x80000000};
    std::cout<<arr[0]<<"\n";
    return 0;
}

请记住;“compiles”!=“works”。

您可以,但不是32而是类型(您的机器上似乎有这种类型)。
[1]
是一条红鲱鱼,你会得到与普通
int
相同的行为,只是为了吹毛求疵。编译器执行转换,有些隐式转换,有些显式转换。程序员通过强制转换指定这种显式转换。你没有提到这一转换(非强制转换)的要点从C++11开始就没有发生过,代码格式不正确。但是这与“将数组直接映射到内存”无关(不管这是什么意思)。此代码在C++03中是合法的(如您所解释的,具有实现定义的行为)C++11中的更改是为了帮助程序员避免编写错误,而不是为了任何技术限制。Re.最后一段:这称为超出范围转换,而不是溢出(当算术运算产生超出范围的结果时会发生这种情况)
#include<iostream>
int main()
{
    int arr[1] = {0x80000000};
    std::cout<<arr[0]<<"\n";
    return 0;
}