簡體   English   中英

關於reinterpret_cast的問題

[英]question about reinterpret_cast

我有以下代碼

#include <iostream>
using namespace std;
int main(){

    int i;
     char *p="this is a string";
     i=reinterpret_cast<int>(p);
     cout<<i<<"\n":



     return 0;
}

輸出是:7648請解釋reinterpret_cast

reinterpret_cast您正在投射的數據視為不同的類型,而不執行任何轉換。 根據該標准, reinterpret_cast之后唯一定義的行為是將其reinterpret_castreinterpret_cast類型。

這聽起來有點無用,但您可能想要使用它的一個原因是,例如,在C ++中使用某些C庫(例如pthreads)。 許多涉及回調的C庫將類型為void*的參數傳遞給回調。 在C ++中,處理這個問題的正確方法是將指針指向您想要用作參數的任何內容, reinterpret_cast它傳遞給C void*時將其reinterpret_castvoid* ,然后reinterpret_castreinterpret_castreinterpret_cast為實際內部的任何內容。打回來。

雖然不保證按標准定義行為 ,但在大多數平台/編譯器上, reinterpret_cast所做的只是將數據視為不同的類型,使用相同的位模式。 例如,如果你有一個32位雙d其位模式恰好是01101010 00111100 01101010 01000001 ,你寫int i = reinterpret_cast<int>(d) ,那么i將是一個整數,其位模式為01101010 00111100 01101010 01000001 ,即使這將表示一個完全不同的數值作為整數而不是雙倍。 顯然,如果涉及的類型不同,這可能會讓您很快陷入困境。

看到這里

究竟有什么不清楚的? 請具體說明。 在你問之前也要搜索,關於這個問題有很多問題。

reinterpret_cast<>這里將轉換而不檢查指向intp指針,但是你不能假設這個int代表什么。 你唯一能做的就是將這個指針轉換回原來的狀態。

更實際的是,編譯器可能會將地址p指向int值,但int size可能與系統指針大小不匹配,因此您可能應該使用類似uintptr_t的內容而不是int

你可以使用類似Boost lexical_cast<>東西,它會嘗試將整數的字符串表示轉換為實際的整數值,但我不確定這是你的目標。

沒有太多可解釋的。 reinterpret_cast的結果是特定於平台的。 您測試輸出的內容可能是字符串常量的地址,也可能是強制轉換為int時剩余的字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM