c++中数组首地址用int强转为啥会报错

img


c++中数组首地址用int强转为啥会报错字符型用int强转是可以转成十进制的

数组 arr 变量,类型是 int *, int 的指针类型, 转 int型肯定报错呀

首先数组名是指针,也就是N个字节的地址,而在此机器上指针地址大小占32个字节,但是int型数据只占4个字节,32字节数据强行int型转换成4字节数据会造成精度缺失,从而报错。可是有些不同的编译器底层逻辑不同,有些能过,有些不能过。但是,输出的结果根据实时编译会出现不同的结果,那就是arr数组分配的地址在int型数据四个字节的范围内,所以不存在精度缺失,故而能编译过,但这存在一定的偶然性

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: 【C++后台开发面经】面试总结第八波:整个知识的查漏补缺中的 在跨平台进行指针传递时,应该用int类型还是long类型 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    结论:应该用long类型

    int类型的长度为4个字节,而long类型是不定的,和操作系统位数保持一致(32位操作系统的long长度为32bit,4个字节,64位操作系统的long长度为64bit,8个字节)。如果用int类型传递64位操作系统的指针,会把高四位地址截断,导致错误。而long型,由于其字节长度和操作系统位数保持一致,因此不会产生地址截断的问题。 

  • 以下回答来自chatgpt:

    问题标题: C++中将数组首地址强制转换为整型为什么会报错?

    问题内容: 我在C++中尝试将数组的首地址强制转换为整型,但为什么会出现错误?然而,当我将字符型强制转换为整型时,是可以转换成十进制的。请问具体原因是什么?

    回答: 在C++中,将数组的首地址强制转换为整型会报错,原因是数组的首地址是一个指针,而指针类型不能直接转换为整型。可以通过使用intptr_t类型进行转换。下面是具体的解决方案:

    #include <iostream>
    #include <cstdint>
    
    int main() {
        int arr[5] = {1, 2, 3, 4, 5};
        int* ptr = arr; // 获取数组的首地址
    
        // 将指针转换为整型
        intptr_t intPtr = reinterpret_cast<intptr_t>(ptr);
    
        // 输出整型地址
        std::cout << "整型地址: " << intPtr << std::endl;
    
        return 0;
    }
    

    在上面的代码中,我们使用reinterpret_cast<intptr_t>将指针ptr转换成intptr_t类型的整型,并输出转换后的整型地址。这样就可以得到数组首地址的整型表示。

    当我们将字符型强制转换为整型时,是可以转换成十进制的。这是因为字符型在内存中存储的是对应字符的ASCII码值,所以可以用整型表示。下面是一个示例代码:

    #include <iostream>
    
    int main() {
        char ch = 'A';
    
        // 将字符转换为整型
        int intCh = static_cast<int>(ch);
    
        // 输出整型值
        std::cout << "整型值: " << intCh << std::endl;
    
        return 0;
    }
    

    在上面的代码中,我们使用static_cast<int>将字符ch转换成整型,并输出转换后的整型值。这样就可以得到字符的整型表示。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^