簡體   English   中英

intptr_t是uintptr_t的簽名對應物(反之亦然)?

[英]Is intptr_t a signed counterpart of uintptr_t (and vice versa)?

我正在為add_signed MPL類開發一些測試,它將類型轉換為已簽名的對應類型。 它的定義如下:

template<class T>
struct add_signed { 
    typedef T type;
};

template<>
struct add_signed<std::uint8_t> { 
    typedef std::int8_t type;
};

template<>
struct add_signed<std::uint16_t> { 
    typedef std::int16_t type;
};

template<>
struct add_signed<std::uint32_t> { 
    typedef std::int32_t type;
};

template<>
struct add_signed<std::uint64_t> { 
    typedef std::int64_t type;
};

在對不同類型進行測試時,我注意到以下評估結果為true:

std::is_same<add_signed<uintptr_t>::type, intptr_t>::value  // true

類似地,對於add_unsigned MPL類,以下代碼的計算結果為true:

std::is_same<add_unsigned<intptr_t>::type, uintptr_t>::value  // true

我的編譯器是MSVC 2010。

所以問題是 - 我們可以假設在所有(理智的)編譯器中簽名intptr_t會產生uintptr_t,反之亦然嗎?

intptr_tuintptr_t在ISO / IEC 9899:1999(C99)中是可選的,但是其中一個是實現的,另一個是實現的。 所有簽名類型都具有相同大小的無符號對應項,反之亦然。

§7.18.1整數類型

當typedef名稱僅在初始u的存在或不存在時有所不同時,它們應表示6.2.5中描述的相應的有符號和無符號類型; 提供這些相應類型之一的實現也應提供另一種。

...

§7.18.1.4能夠保存對象指針的整數類型

以下類型指定一個帶符號的整數類型,其屬性是任何有效的void指針都可以轉換為此類型,然后轉換回指向void的指針,結果將等於原始指針:

 intptr_t 

以下類型指定一個無符號整數類型,其屬性是任何有效的void指針都可以轉換為此類型,然后轉換回指向void的指針,結果將與原始指針進行比較:

  uintptr_t 

這些類型是可選的。

注意,在C標准的含義內,函數不是對象; C標准不保證uintptr_t可以保存函數指針。

幸運的是, POSIX采取措施:它確實需要對象指針和函數指針的大小相同。

2.12.3指針類型

所有函數指針類型應與void指向的類型指針具有相同的表示形式。 將函數指針轉換為void *不得改變表示。 這種轉換產生的void *值可以使用顯式轉換轉換回原始函數指針類型,而不會丟失信息。

注意:

ISO C標准不要求這樣,但它是POSIX一致性所必需的。

暫無
暫無

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

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