第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

gcc中有128位整數(shù)嗎?

gcc中有128位整數(shù)嗎?

C
江戶川亂折騰 2019-11-20 10:48:09
我想要一個(gè)128位整數(shù),因?yàn)槲蚁氪鎯?chǔ)兩個(gè)64位數(shù)字相乘的結(jié)果。在gcc 4.4及更高版本中是否存在此類問(wèn)題?
查看完整描述

3 回答

?
慕姐8265434

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊

128位整數(shù)類型僅在64位目標(biāo)上可用,因此即使您已經(jīng)檢測(cè)到最新的GCC版本,也需要檢查可用性。從理論上講,gcc 可以在需要4個(gè)32位寄存器來(lái)保存一個(gè)寄存器的機(jī)器上支持TImode整數(shù),但是我認(rèn)為在任何情況下它都不支持。


GCC 4.6及更高版本具有__int128/ unsigned __int128定義為內(nèi)置類型。 使用

#ifdef __SIZEOF_INT128__檢測(cè)到它。


GCC 4.1及更高版本在__int128_t和__uint128_t中定義<stdint.h>。在最新的編譯器上,這大概是用定義的__int128。(#include <stdint.h>如果要使用__int128_t名稱代替,則仍然需要__int128。)


我在Godbolt編譯器資源管理器上測(cè)試了第一個(gè)支持這3種功能的編譯器版本(在x86-64上)。Godbolt僅返回到gcc4.1,ICC13和clang3.0,因此我用<= 4.1表示實(shí)際的第一個(gè)支持可能更早。


         legacy               recommended(?)    |  One way of detecting support

        __uint128_t   |  [unsigned]  __int128   |  #ifdef __SIZEOF_INT128__

gcc        <=  4.1    |       4.6               |     4.6

clang      <=  3.0    |       3.1               |     3.3

ICC        <=  13     |     <= 13               |     16.  (Godbolt doesn't have 14 or 15)

如果您為ARM或x86之類的32位體系結(jié)構(gòu)進(jìn)行編譯-m32,即使這些編譯器中的任何最新版本都不支持128位整數(shù)類型。 因此,如果沒(méi)有它,代碼完全可以工作,則需要在使用前檢測(cè)支持。


我知道唯一可以檢測(cè)到的直接CPP宏是__SIZEOF_INT128__,但是不幸的是,一些舊的編譯器版本在不定義它的情況下就支持它。(并且沒(méi)有__uint128_tgcc4.6樣式的宏unsigned __int128)。 如何知道__uint128_t是否已定義


某些人仍然使用RHEL(RedHat Enterprise Linux)上的gcc4.4之類的古老編譯器版本,或類似的硬殼舊系統(tǒng)。如果您關(guān)心這樣的過(guò)時(shí)gcc版本,則可能要堅(jiān)持使用__uint128_t。也許sizeof(int_fast32_t)出于某種原因,在某些64位ISA上可以檢測(cè)到64 位的錯(cuò)誤。但不是在x32或ILP32 AArch64之類的ILP32 ISA上,因此也許只是檢查sizeof(void*)是否__SIZEOF_INT128__未定義。


gcc __int128可能沒(méi)有定義一些64位ISA,甚至gcc 卻定義了一些32位ISA __int128,但我不知道。


正如這里對(duì)另一個(gè)答案的評(píng)論所指出的那樣,GCC內(nèi)部是整數(shù)TI模式。(四整數(shù)=的4x寬度int,DImode =兩倍的寬度,SImode =普通的int。)正如GCC手冊(cè)指出的那樣,__int128支持128位整數(shù)模式(TImode)的目標(biāo)支持。


typedef unsigned uint128_t __attribute__ ((mode (TI)));

隨機(jī)事實(shí):ICC19 -E -dM定義:


#define __GLIBCXX_TYPE_INT_N_0 __int128

#define __GLIBCXX_BITSIZE_INT_N_0 128

測(cè)試功能為:


#include <stdint.h>


#define uint128_t __uint128_t

//#define uint128_t unsigned __int128


uint128_t mul64(uint64_t a, uint64_t b) {

    return (uint128_t)a * b;

}

所有支持它的編譯器都可以高效地對(duì)其進(jìn)行編譯,從而


    mov       rax, rdi

    mul       rsi

    ret                          # return in RDX:RAX


查看完整回答
反對(duì) 回復(fù) 2019-11-20
?
互換的青春

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊

啊,大整數(shù)不是C的強(qiáng)項(xiàng)。

GCC確實(shí)有一個(gè)unsigned __int128__int128類型,從版本4.something開(kāi)始(此處不確定)。我似乎確實(shí)記得,但是,__int128_t在此之前有一個(gè)定義。

這些僅在64位目標(biāo)上可用。

(編者注:這個(gè)答案用來(lái)聲稱GCC定義uint128_tint128_t我在Godbolt編譯探險(xiǎn)測(cè)試的版本中沒(méi)有定義這些類型,而領(lǐng)先的。__從gcc4.1到8.2,或鏗鏘或ICC)。


查看完整回答
反對(duì) 回復(fù) 2019-11-20
  • 3 回答
  • 0 關(guān)注
  • 2240 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)