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

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

如何在C+中的大端值和小端點(diǎn)值之間進(jìn)行轉(zhuǎn)換?

如何在C+中的大端值和小端點(diǎn)值之間進(jìn)行轉(zhuǎn)換?

C++ C
慕容3067478 2019-06-12 21:22:05
如何在C+中的大端值和小端點(diǎn)值之間進(jìn)行轉(zhuǎn)換?如何在C+中的大端值和小端點(diǎn)值之間進(jìn)行轉(zhuǎn)換?編輯:為了清晰起見,我必須將二進(jìn)制數(shù)據(jù)(雙精度浮點(diǎn)值和32位和64位整數(shù))從一個(gè)CPU體系結(jié)構(gòu)轉(zhuǎn)換到另一個(gè)CPU體系結(jié)構(gòu)。這不涉及聯(lián)網(wǎng),因此Ntoh()和類似的函數(shù)在這里不能工作。編輯2:我接受的答案直接適用于我正在獲取的編譯器(這就是我選擇它的原因)。然而,這里還有其他更好、更便攜的答案。
查看完整描述

3 回答

?
滄海一幻覺

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

如果你用Visual C+執(zhí)行以下操作:包含in.h并調(diào)用以下函數(shù):

對(duì)于16位數(shù):

unsigned short _byteswap_ushort(unsigned short value);

對(duì)于32位數(shù):

unsigned long _byteswap_ulong(unsigned long value);

對(duì)于64位數(shù):

unsigned __int64 _byteswap_uint64(unsigned __int64 value);

8位數(shù)字(字符)不需要轉(zhuǎn)換。

此外,這些也只為它們?yōu)橛蟹?hào)整數(shù)工作的無符號(hào)值定義。

對(duì)于浮點(diǎn)數(shù)和雙面數(shù),就像普通整數(shù)一樣,難度更大,因?yàn)檫@些整數(shù)可能是按主機(jī)字節(jié)順序排列的,也可能不按字節(jié)順序排列。你可以在大端機(jī)器上得到小終端浮點(diǎn)數(shù),反之亦然.

其他編譯器也有類似的本質(zhì)。

在……里面GCC例如,您可以直接調(diào)用:

int32_t __builtin_bswap32 (int32_t x)int64_t __builtin_bswap64 (int64_t x)

(不需要包括什么)。h也以一種非GCC中心的方式聲明相同的函數(shù)。

16位交換,只是一點(diǎn)點(diǎn)旋轉(zhuǎn)。

調(diào)用本質(zhì),而不是滾動(dòng)自己的,給你最好的性能和代碼密度,順便說一句。


查看完整回答
反對(duì) 回復(fù) 2019-06-12
?
幕布斯6054654

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

簡(jiǎn)單地說:

#include <climits>template <typename T>T swap_endian(T u){
    static_assert (CHAR_BIT == 8, "CHAR_BIT != 8");

    union
    {
        T u;
        unsigned char u8[sizeof(T)];
    } source, dest;

    source.u = u;

    for (size_t k = 0; k < sizeof(T); k++)
        dest.u8[k] = source.u8[sizeof(T) - k - 1];

    return dest.u;}

用法:swap_endian<uint32_t>(42).


查看完整回答
反對(duì) 回復(fù) 2019-06-12
?
拉莫斯之舞

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

從…拜德秩序謬誤羅布·派克:

假設(shè)您的數(shù)據(jù)流有一個(gè)端編碼的32位整數(shù)。下面是如何提取它(假設(shè)沒有簽名的字節(jié)):

i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);

如果它是大端,下面是如何提取它:

i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);

TL;DR:不要擔(dān)心您的平臺(tái)原生順序,所有重要的是您正在讀取的流的字節(jié)順序,您最好希望它有良好的定義。

注:注釋中指出,如果沒有顯式類型轉(zhuǎn)換,則重要的是data是一個(gè)數(shù)組unsigned charuint8_t..使用signed charchar(如果簽署)將導(dǎo)致data[x]被提升為整數(shù)和data[x] << 24可能將1移動(dòng)到符號(hào)位,即UB。


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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