จำนวนเต็มเป็นสตริงเลขฐานสิบหกใน C ++


128

ฉันจะแปลงจำนวนเต็มเป็นสตริงฐานสิบหกในC ++ ได้อย่างไร

ฉันสามารถหาวิธีทำได้ แต่ส่วนใหญ่ดูเหมือนจะมุ่งเป้าไปที่ C ดูเหมือนจะไม่มีวิธีดั้งเดิมที่จะทำใน C ++ มันเป็นปัญหาที่ค่อนข้างง่าย ฉันมีสิ่งintที่ฉันต้องการแปลงเป็นสตริงฐานสิบหกสำหรับการพิมพ์ในภายหลัง

คำตอบ:


226

ใช้<iomanip>'s std::hex. หากคุณพิมพ์เพียงส่งไปที่std::coutหากไม่เป็นเช่นนั้นให้ใช้std::stringstream

std::stringstream stream;
stream << std::hex << your_int;
std::string result( stream.str() );

คุณสามารถนำหน้าตัวแรก<<ด้วย<< "0x"หรืออะไรก็ได้ตามต้องการ

ผลประโยชน์อื่น ๆ ได้แก่std::oct(ฐานแปด) และstd::dec(กลับเป็นฐานสิบ)

ปัญหาหนึ่งที่คุณอาจพบคือความจริงที่ว่าสิ่งนี้ทำให้เกิดจำนวนตัวเลขที่แน่นอนที่จำเป็นในการแสดง คุณสามารถใช้setfillและsetwสิ่งนี้เพื่อหลีกเลี่ยงปัญหา:

stream << std::setfill ('0') << std::setw(sizeof(your_type)*2) 
       << std::hex << your_int;

ในที่สุดฉันขอแนะนำฟังก์ชันดังกล่าว:

template< typename T >
std::string int_to_hex( T i )
{
  std::stringstream stream;
  stream << "0x" 
         << std::setfill ('0') << std::setw(sizeof(T)*2) 
         << std::hex << i;
  return stream.str();
}

7
@MSalters - ค่อนข้างตรงกันข้าม ทดสอบข้อเสนอแนะของคุณเกี่ยวกับintประเภท;)
Kornel Kisielewicz

2
@LexFridman เพื่อแสดงจำนวนเลขฐานสิบหกตามที่ต้องการ ทำไมต้องปล่อยตัวเลข 8 หลักถ้าประเภทเป็น uint8_t?
Kornel Kisielewicz

16
คำเตือน: สิ่งนี้จะใช้ไม่ได้กับไบต์เดียวเนื่องจากถ่านถูกตีเป็นอักขระเสมอ
ov7a

5
คุณต้องการ #include <sstream>
David Gausmann

2
ถ้าฉันจัดรูปแบบ ints หลายดูเหมือนว่าstd::setwความต้องการที่จะส่งออกไปยังสตรีมทุก int ขณะstd::hex, std::setfill, std::uppercase... ต้องการเพียงที่จะถูกส่งไปยังกระแสออกครั้งเดียว ดูเหมือนว่าไม่สอดคล้องกัน?
wcochran

39

เพื่อให้เบาและเร็วขึ้นฉันขอแนะนำให้ใช้การเติมสตริงโดยตรง

template <typename I> std::string n2hexstr(I w, size_t hex_len = sizeof(I)<<1) {
    static const char* digits = "0123456789ABCDEF";
    std::string rc(hex_len,'0');
    for (size_t i=0, j=(hex_len-1)*4 ; i<hex_len; ++i,j-=4)
        rc[i] = digits[(w>>j) & 0x0f];
    return rc;
}

สิ่งนี้จะใช้ได้กับทุกประเภทหรือไม่? ฉันหมายถึง double, float, uint8_t?
อาร์

@SR มันใช้ได้กับประเภทอินทิกรัลไม่ใช่สำหรับdoubleและfloat(ไม่ใช่สำหรับพอยน์เตอร์)
Wolf

... ส่วนผสมของ C และ C ++ ในเชิงปฏิบัติมาก (แต่ใช้ได้) ฉันไม่แน่ใจเกี่ยวกับความเร็ว ... สำหรับรสนิยมของฉันมันค่อนข้างหนาแน่น
Wolf

ขอบคุณคำตอบที่ยอดเยี่ยม การนำไลบรารีสตรีม 'เพียง' มาทำสิ่งนี้ดูเหมือนเป็นการสูญเปล่า
DeveloperChris

1
สิ่งนี้พิมพ์0000FFFFสำหรับ0xFFFF. ฉันชอบที่จะมี0xFFFFเป็นเอาต์พุต
DrumM

24

ใช้std::stringstreamเพื่อแปลงจำนวนเต็มเป็นสตริงและตัวปรับแต่งพิเศษเพื่อตั้งค่าฐาน ตัวอย่างเช่น:

std::stringstream sstream;
sstream << std::hex << my_integer;
std::string result = sstream.str();

14

เพียงพิมพ์เป็นเลขฐานสิบหก:

int i = /* ... */;
std::cout << std::hex << i;

8
ฉันจะใช้std::cout<<std::hex<<i<<std::dec;มิฉะนั้นจำนวนเต็มทั้งหมดที่สตรีมในภายหลังจะเป็นเลขฐานสิบหก คุณไม่จำเป็นต้องทำเช่นนั้นสำหรับคำตอบอื่น ๆ ที่ใช้stringstreamเนื่องจากสตรีมจะถูกยกเลิกหลังจากใช้งาน แต่จะมีcoutชีวิตอยู่ตลอดไป
Mark Lakata

8

คุณสามารถลองทำดังต่อไปนี้ มันทำงาน ...

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;

template <class T>
string to_string(T t, ios_base & (*f)(ios_base&))
{
  ostringstream oss;
  oss << f << t;
  return oss.str();
}

int main ()
{
  cout<<to_string<long>(123456, hex)<<endl;
  system("PAUSE");
  return 0;
}

1
เป็นคำตอบที่ดี แต่ระวังว่าto_stringเป็นส่วนหนึ่งของเนมสเปซstdใน C ++ 11
Alex

@ อเล็กซ์ใช่มันเป็นปี 2014 แล้ว ... สวรรค์ห้ามไม่ให้เราต้องเริ่มจัดการกับ C ++ 14 ในไม่ช้า
Alex

7

คำถามนี้เก่า แต่ฉันแปลกใจว่าทำไมไม่มีใครพูดถึงboost::format:

cout << (boost::format("%x") % 1234).str();  // output is: 4d2


4

ขอบคุณความคิดเห็นของลินคอล์นด้านล่างฉันได้เปลี่ยนคำตอบนี้

คำตอบต่อไปนี้จัดการ ints 8 บิตอย่างถูกต้องในเวลาคอมไพล์ อย่างไรก็ตามมันต้องการ C ++ 17 หากคุณไม่มี C ++ 17 คุณจะต้องทำอย่างอื่น (เช่นจัดเตรียมฟังก์ชันนี้มากเกินไปหนึ่งรายการสำหรับ uint8_t และอีกรายการหนึ่งสำหรับ int8_t หรือใช้อย่างอื่นนอกเหนือจาก "if constexpr" อาจจะ enable_if)

template< typename T >
std::string int_to_hex( T i )
{
    // Ensure this function is called with a template parameter that makes sense. Note: static_assert is only available in C++11 and higher.
    static_assert(std::is_integral<T>::value, "Template argument 'T' must be a fundamental integer type (e.g. int, short, etc..).");

    std::stringstream stream;
    stream << "0x" << std::setfill ('0') << std::setw(sizeof(T)*2) << std::hex;

    // If T is an 8-bit integer type (e.g. uint8_t or int8_t) it will be 
    // treated as an ASCII code, giving the wrong result. So we use C++17's
    // "if constexpr" to have the compiler decides at compile-time if it's 
    // converting an 8-bit int or not.
    if constexpr (std::is_same_v<std::uint8_t, T>)
    {        
        // Unsigned 8-bit unsigned int type. Cast to int (thanks Lincoln) to 
        // avoid ASCII code interpretation of the int. The number of hex digits 
        // in the  returned string will still be two, which is correct for 8 bits, 
        // because of the 'sizeof(T)' above.
        stream << static_cast<int>(i);
    }        
    else if (std::is_same_v<std::int8_t, T>)
    {
        // For 8-bit signed int, same as above, except we must first cast to unsigned 
        // int, because values above 127d (0x7f) in the int will cause further issues.
        // if we cast directly to int.
        stream << static_cast<int>(static_cast<uint8_t>(i));
    }
    else
    {
        // No cast needed for ints wider than 8 bits.
        stream << i;
    }

    return stream.str();
}

คำตอบเดิมที่จัดการ int 8 บิตไม่ถูกต้องอย่างที่คิด:

คำตอบของ Kornel Kisielewicz นั้นยอดเยี่ยมมาก แต่การเพิ่มเล็กน้อยจะช่วยตรวจจับกรณีที่คุณเรียกใช้ฟังก์ชันนี้ด้วยอาร์กิวเมนต์เทมเพลตที่ไม่สมเหตุสมผล (เช่น float) หรืออาจทำให้เกิดข้อผิดพลาดของคอมไพเลอร์ที่ยุ่งเหยิง (เช่นประเภทที่ผู้ใช้กำหนดเอง)

template< typename T >
std::string int_to_hex( T i )
{
  // Ensure this function is called with a template parameter that makes sense. Note: static_assert is only available in C++11 and higher.
  static_assert(std::is_integral<T>::value, "Template argument 'T' must be a fundamental integer type (e.g. int, short, etc..).");

  std::stringstream stream;
  stream << "0x" 
         << std::setfill ('0') << std::setw(sizeof(T)*2) 
         << std::hex << i;

         // Optional: replace above line with this to handle 8-bit integers.
         // << std::hex << std::to_string(i);

  return stream.str();
}

ฉันได้แก้ไขสิ่งนี้เพื่อเพิ่มการเรียกไปที่ std :: to_string เนื่องจากประเภทจำนวนเต็ม 8 บิต (เช่นstd::uint8_tค่าที่ส่งผ่าน) std::stringstreamจะถือว่าเป็นถ่านซึ่งไม่ได้ให้ผลลัพธ์ที่คุณต้องการ การส่งจำนวนเต็มดังกล่าวเพื่อstd::to_stringจัดการกับพวกมันอย่างถูกต้องและไม่ทำร้ายสิ่งต่าง ๆ เมื่อใช้จำนวนเต็มชนิดอื่นที่ใหญ่กว่า แน่นอนว่าคุณอาจได้รับผลกระทบด้านประสิทธิภาพเล็กน้อยในกรณีเหล่านี้เนื่องจากไม่จำเป็นต้องใช้การเรียก std :: to_string

หมายเหตุ: ฉันเพิ่งจะเพิ่มสิ่งนี้ในความคิดเห็นในคำตอบเดิม แต่ฉันไม่มีตัวแทนที่จะแสดงความคิดเห็น


ในการทดสอบของฉัน std :: to_string (i) ไม่พิมพ์ std :: uint8_t จำนวนเต็มเป็นเลขฐานสิบหก ฉันคิดว่าสิ่งนี้อาจจะต้องมีเงื่อนไขแยกกันสำหรับทั้งประเภท uint8_t และ int8_t เนื่องจากต้องถูกโยนเป็นจำนวนเต็มที่ใหญ่กว่า
Lincoln

1
@ ลินคอล์นคุณพูดถูก ฉันไม่รู้ว่าตอนนั้นฉันกำลังทำอะไรอยู่ (หลายเดือนที่แล้วตอนนี้) ที่ทำให้ฉันมีสิ่งที่ to_string จัดการกับ ints 8 บิต ฉันยังกลับไปใช้เวอร์ชันคอมไพเลอร์ฉันคิดว่าฉันใช้ในตอนนั้นเพียงเพื่อตรวจสอบอีกครั้ง แต่ to_string ไม่ได้ผลอย่างที่บอก แล้วใครจะรู้? อย่างไรก็ตามขอบคุณที่จับสิ่งนี้ - ฉันได้แก้ไขคำตอบของสิ่งที่ควรทำงานได้อย่างถูกต้อง
Loss Mentality

1
สิ่งนี้จะยังคงใช้งานได้โดยไม่คาดคิดสำหรับchar(ซึ่งแตกต่างจากทั้งสองอย่างuint8_tและint8_tในการใช้งานส่วนใหญ่ (โดยที่พวกเขาอยู่ตามลำดับunsigned charและsigned char))
Ruslan

@ruslan ใช่นอกจากนี้ยังมีบูลและประเภทอักขระแบบกว้างทั้งหมดตรงกับมาตรฐาน :: is_integral และจะไม่ล้มเหลวในการยืนยัน แต่เนื่องจาก char เป็นตามมาตรฐานซึ่งเป็นประเภทที่ไม่ซ้ำกันที่รับประกันเช่นเดียวกับประเภทอักขระแบบกว้างคุณจึงสามารถจัดการทั้งหมดได้หากต้องการ (ข้อยกเว้นคือถ่านที่ไม่ได้ลงนาม / ซึ่งตรงกับประเภทปริพันธ์ที่ไม่ได้ลงนามของความกว้างใด ๆ a ไบต์อยู่ในเครื่องปัจจุบัน - โดยทั่วไปจะเป็น int8 - ดังนั้นจึงไม่สามารถกรองได้หากคุณต้องการจับคู่ ints ที่มีความกว้างเท่ากันด้วย) คุณสามารถปฏิเสธ char, wide chars, bools ได้โดยเพิ่มเงื่อนไขให้มากขึ้นใน static_assert: ... && !std::is_same_v<char, T> && !std::is_same_v<bool, T>etc ...
Loss Mentality

2

สำหรับพวกคุณที่คิดว่าส่วนใหญ่ / ส่วนใหญ่ใช้ios::fmtflagsไม่ได้std::stringstreamแต่เหมือนกับแนวคิดเทมเพลตที่ Kornel โพสต์ย้อนกลับไปเมื่อนั้นสิ่งต่อไปนี้ใช้งานได้และค่อนข้างสะอาด:

#include <iomanip>
#include <sstream>


template< typename T >
std::string hexify(T i)
{
    std::stringbuf buf;
    std::ostream os(&buf);


    os << "0x" << std::setfill('0') << std::setw(sizeof(T) * 2)
       << std::hex << i;

    return buf.str().c_str();
}


int someNumber = 314159265;
std::string hexified = hexify< int >(someNumber);

9
คุณไม่ควรส่งคืน buf.str ()?
ruipacheco

2

ฉันทำ:

int hex = 10;      
std::string hexstring = stringFormat("%X", hex);  

ดูคำตอบSOจาก iFreilicht และไฟล์ส่วนหัวเทมเพลตที่ต้องการจากที่นี่GIST !


2

ลองดูวิธีแก้ปัญหาของฉัน[1]ที่ฉันคัดลอกแบบคำต่อคำจากโครงการของฉันดังนั้นจึงมีเอกสาร API ภาษาเยอรมันรวมอยู่ด้วย เป้าหมายของฉันคือการผสมผสานความยืดหยุ่นและความปลอดภัยเข้ากับความต้องการที่แท้จริงของฉัน: [2]

  • ไม่มีการ0xเพิ่มคำนำหน้า : ผู้โทรอาจตัดสินใจได้
  • การหักความกว้างอัตโนมัติ: พิมพ์น้อยลง
  • การควบคุมความกว้างอย่างชัดเจน : การขยับขยายสำหรับการจัดรูปแบบ (ไม่สูญเสีย) การย่อขนาดเพื่อประหยัดพื้นที่
  • สามารถจัดการกับ long long
  • จำกัด เฉพาะประเภทอินทิกรัล : หลีกเลี่ยงความประหลาดใจโดยการแปลงแบบเงียบ
  • เข้าใจง่าย
  • ไม่มีขีด จำกัด ฮาร์ดโค้ด
#include <string>
#include <sstream>
#include <iomanip>

/// Vertextet einen Ganzzahlwert val im Hexadezimalformat.
/// Auf die Minimal-Breite width wird mit führenden Nullen aufgefüllt;
/// falls nicht angegeben, wird diese Breite aus dem Typ des Arguments
/// abgeleitet. Funktion geeignet von char bis long long.
/// Zeiger, Fließkommazahlen u.ä. werden nicht unterstützt, ihre
/// Übergabe führt zu einem (beabsichtigten!) Compilerfehler.
/// Grundlagen aus: http://stackoverflow.com/a/5100745/2932052
template <typename T>
inline std::string int_to_hex(T val, size_t width=sizeof(T)*2)
{
    std::stringstream ss;
    ss << std::setfill('0') << std::setw(width) << std::hex << (val|0);
    return ss.str();
}

[1]จากคำตอบของKornel Kisielewicz
[2]แปลเป็นภาษาCppTestนี่คือวิธีอ่าน:

TEST_ASSERT(int_to_hex(char(0x12)) == "12");
TEST_ASSERT(int_to_hex(short(0x1234)) == "1234");
TEST_ASSERT(int_to_hex(long(0x12345678)) == "12345678");
TEST_ASSERT(int_to_hex((long long)(0x123456789abcdef0)) == "123456789abcdef0");
TEST_ASSERT(int_to_hex(0x123, 1) == "123");
TEST_ASSERT(int_to_hex(0x123, 8) == "00000123");
// with deduction test as suggested by Lightness Races in Orbit:
TEST_ASSERT(int_to_hex(short(0x12)) == "0012"); 

1
สามารถแสดงการหักความกว้างด้วยเช่นTEST_ASSERT(int_to_hex(short(0x12)) == "0012");
Lightness Races ใน Orbit

2

รหัสสำหรับการอ้างอิงของคุณ:

#include <iomanip>
#include <sstream>
...
string intToHexString(int intValue) {

    string hexStr;

    /// integer value to hex-string
    std::stringstream sstream;
    sstream << "0x"
            << std::setfill ('0') << std::setw(2)
    << std::hex << (int)intValue;

    hexStr= sstream.str();
    sstream.clear();    //clears out the stream-string

    return hexStr;
}

4
นี้ไม่ได้จริงๆเพิ่มคำตอบที่มีอยู่และก็ไม่มีจุดหมายที่ชัดเจน(มันจะถูกทำลายเมื่อกลับมาทำงานในบรรทัดถัดไปแล้ว) คุณสามารถหลีกเลี่ยงการตั้งชื่อทั้งหมดโดยไม่ต้องใช้และได้รับผลเช่นเดียวกันโดยลดโค้ดสี่บรรทัดให้เหลือหนึ่ง clearsstreamhexStrreturn sstream.str();clear
ShadowRanger

1
เมื่อจุดประสงค์ของฟอรัมคือการเข้าใจสิ่งต่างๆและการใช้งาน การใช้ verbose นั้นดีกว่าในการให้ภาพที่ชัดเจนมากกว่าการบันทึกเส้น คำถามไม่ได้อยู่ในโค้ดที่ปรับให้เหมาะสมและคำตอบพยายามที่จะให้วิธีการแบบโมดูลาร์ในการจัดการกับการแปลงดังกล่าว @ShadowRanger
parasrish

1
มีจุดประสงค์เพื่อsstream.clear();อะไร? sstreamวัตถุถูกทำลายโดยอัตโนมัติในตอนท้ายของขอบเขตดังนั้นreturn sstream.str();จะทำ
Wolf

sstream.clearจะล้างเนื้อหาก่อนที่สตรีมจะจบลงด้วยการสิ้นสุดขอบเขต (เพื่อล้างแฟล็กความล้มเหลวและ eof ใด ๆ อย่างชัดเจน) อันที่จริงเมื่อขอบเขตตายพร้อมกับช่วงชีวิตของตัวแปรสตรีมและดังนั้นจึงsstream.strสามารถใช้เพื่อส่งคืนตามค่าได้ [อ้างอิง: cplusplus.com/reference/ios/ios/clear/]
parasrish

2

ทางออกของฉัน อนุญาตเฉพาะประเภทอินทิกรัลเท่านั้น

ปรับปรุง คุณสามารถตั้งค่าคำนำหน้าทางเลือก 0x ในพารามิเตอร์ที่สอง

definition.h

#include  <iomanip>
#include <sstream>

template <class T, class T2 = typename std::enable_if<std::is_integral<T>::value>::type>
static std::string ToHex(const T & data, bool addPrefix = true);



template<class T, class>
inline std::string Convert::ToHex(const T & data, bool addPrefix)
{
    std::stringstream sstream;
    sstream << std::hex;
    std::string ret;
    if (typeid(T) == typeid(char) || typeid(T) == typeid(unsigned char) || sizeof(T)==1)
    {
        sstream << static_cast<int>(data);
        ret = sstream.str();
        if (ret.length() > 2)
        {
            ret = ret.substr(ret.length() - 2, 2);
        }
    }
    else
    {
        sstream << data;
        ret = sstream.str();
    }
    return (addPrefix ? u8"0x" : u8"") + ret;
}

main.cpp

#include <definition.h>
int main()
{
    std::cout << ToHex<unsigned char>(254) << std::endl;
    std::cout << ToHex<char>(-2) << std::endl;
    std::cout << ToHex<int>(-2) << std::endl;
    std::cout << ToHex<long long>(-2) << std::endl;

    std::cout<< std::endl;
    std::cout << ToHex<unsigned char>(254, false) << std::endl;
    std::cout << ToHex<char>(-2, false) << std::endl;
    std::cout << ToHex<int>(-2, false) << std::endl;
    std::cout << ToHex<long long>(-2, false) << std::endl;
    return 0;
}

ผลลัพธ์:
0xfe
0xfe
0xfffffffe
0xfffffffffffffffffe

fe
fe fffffffe
fffffffffffffffffe


1

ฉันต้องการเพิ่มคำตอบเพื่อเพลิดเพลินกับความสวยงามของภาษา C ++ ความสามารถในการปรับตัวเพื่อทำงานในระดับสูงและต่ำ มีความสุขในการเขียนโปรแกรม

public:template <class T,class U> U* Int2Hex(T lnumber, U* buffer)
{
    const char* ref = "0123456789ABCDEF";
    T hNibbles = (lnumber >> 4);

    unsigned char* b_lNibbles = (unsigned char*)&lnumber;
    unsigned char* b_hNibbles = (unsigned char*)&hNibbles;

    U* pointer = buffer + (sizeof(lnumber) << 1);

    *pointer = 0;
    do {
        *--pointer = ref[(*b_lNibbles++) & 0xF];
        *--pointer = ref[(*b_hNibbles++) & 0xF];
    } while (pointer > buffer);

    return buffer;
}

ตัวอย่าง:

char buffer[100] = { 0 };
Int2Hex(305419896ULL, buffer);//returns "0000000012345678"
Int2Hex(305419896UL, buffer);//returns "12345678"
Int2Hex((short)65533, buffer);//returns "FFFD"
Int2Hex((char)18, buffer);//returns "12"

wchar_t buffer[100] = { 0 };
Int2Hex(305419896ULL, buffer);//returns L"0000000012345678"
Int2Hex(305419896UL, buffer);//returns L"12345678"
Int2Hex((short)65533, buffer);//returns L"FFFD"
Int2Hex((char)18, buffer);//returns L"12"

วิธีนี้ใช้เทคนิคบางอย่างที่ไม่เห็นในคำตอบอื่น ๆ คุณช่วยแก้ไขคำตอบเพื่อให้มีคำอธิบายวิธีการและเหตุผลได้ไหม
Jason Aller

0
#include <iostream> 
#include <sstream>  

int main()
{
unsigned int i = 4967295; // random number
std::string str1, str2;
unsigned int u1, u2;

std::stringstream ss;

การใช้ตัวชี้โมฆะ:

// INT to HEX
ss << (void*)i;       // <- FULL hex address using void pointer
ss >> str1;          //     giving address value of one given in decimals.
ss.clear();         // <- Clear bits
// HEX to INT
ss << std::hex << str1;   // <- Capitals doesn't matter so no need to do extra here
ss >> u1;
ss.clear();

การเพิ่ม 0x:

// INT to HEX with 0x
ss << "0x" << (void*)i;   // <- Same as above but adding 0x to beginning
ss >> str2;
ss.clear();
// HEX to INT with 0x
ss << std::hex << str2;   // <- 0x is also understood so need to do extra here
ss >> u2;
ss.clear();

ขาออก:

std::cout << str1 << std::endl; // 004BCB7F
std::cout << u1 << std::endl;   // 4967295
std::cout << std::endl;
std::cout << str2 << std::endl; // 0x004BCB7F
std::cout << u2 << std::endl;   // 4967295


return 0;
}

-1
int var = 20;
cout <<                          &var << endl;
cout <<                     (int)&var << endl;
cout << std::hex << "0x" << (int)&var << endl << std::dec; // output in hex, reset back to dec

0x69fec4 (แอดเดรส)
6946500 (แอดเดรสถึงเดค)
0x69fec4 (แอดเดรสเดคเอาต์พุตเป็นเลขฐานสิบหก)


สัญชาตญาณไปกับสิ่งนี้ ...
int address = (int) & var;

เห็นสิ่งนี้ที่อื่น ... ที่
อยู่แบบยาวที่ไม่ได้ลงนาม = reinterpret_cast (& var);

ความคิดเห็นบอกฉันว่าถูกต้อง ...
int address = (int) & var;

เมื่อพูดถึง ความสว่างที่ปกคลุมอย่างดีคุณอยู่ที่ไหน? มีคนชอบมากเกินไป!


คำถามนี้ได้รับการตอบรับอย่างดีอยู่แล้ว คำตอบของคุณเพิ่มอะไรให้กับผู้ที่โพสต์แล้ว? และที่อยู่ต้องทำอย่างไรกับมัน?
Lightness Races ใน Orbit

@LightnessRacesinOrbit ยังไม่ได้ปิดเลยเหรอ คุณพูดแบบนั้นกับ 3 คนสุดท้ายที่แสดงความคิดเห็นหรือไม่? แค่นี้ก็ยิ่งตรงประเด็นสำหรับสิ่งที่ฉันกำลังมองหา มันอาจช่วยคนอื่นได้ และที่อยู่ต้องทำอย่างไรกับที่อยู่ ใครอ่านที่อยู่เป็นทศนิยม มันเป็นตัวอย่างจริง
Puddle

การโพสต์คำตอบเดียวกันกับที่โพสต์ไปแล้วเมื่อเกือบเก้าปีที่แล้วถือว่าไม่มีประโยชน์และการแนะนำตัวชี้ไปยังสมการนี้ดูเหมือนจะออกมาจากสีน้ำเงิน - OP ไม่ได้ถามเกี่ยวกับพอยน์เตอร์ นอกจากนี้ไม่มันจะไม่เป็นเช่นนั้นunsigned longแต่ std::intptr_t
Lightness Races ใน Orbit

intptr_t = int ... uintptr_t = unsigned int ... ที่อยู่หน่วยความจำถูกลงนามตอนนี้หรือไม่ และหน่วยความจำ int ให้คุณเท่าไหร่?
Puddle

คุณพลาดประเด็น intptr_tสามารถเก็บชี้ใด ๆ เกี่ยวกับการสร้างแพลตฟอร์ม; ที่ไม่ได้ [จำเป็น] unsigned intที่แท้จริงของ และอีกครั้งไม่มีสิ่งใดที่เกี่ยวข้องกับคำถามนี้ ไม่มีคำตอบใด ๆ จากฉันอีกต่อไป
Lightness Races in Orbit
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.