簡體   English   中英

將uint64_t截斷為uint8_t [i]時,我應該使用位掩碼嗎?

[英]Should I use a bit mask when truncating uint64_t to uint8_t[i]?

如果我有一個大的int,比如一個uint64_t和一個uint8_t數組,例如:

uint64_t large = 12345678901234567890;
uint8_t small[5];

我想將uint64_t的8個最低有效位復制到uint8_t數組的元素中,使用它是否安全:

small[3] = large;

或者我應該使用位掩碼:

small[3] = large & 255;

即是否有任何情況,其中大型int的其余部分可能以某種方式溢出到數組的其他元素?

它肯定不會導致數據處理不正確。 但是,某些編譯器可能會生成警告消息。

有兩種方法可以避免這些。

你可以投射你的變量:

(uint8_t)large

或者您可以禁用警告:

#pragma warning(disable:4503)

我建議轉換變量,因為隱藏編譯器警告可能會使您無法發現實際問題,因此不是最佳實踐。

非常安全

small[3] = large;

並且[conv.integral]中明確描述了這種轉換:

如果目標類型是無符號的,則結果值是與源整數一致的最小無符號整數(模2 n ,其中n是用於表示無符號類型的位數)。

也就是說,這四個語句都保證在small[3]以相同的值結束:

small[3] = large;
small[3] = large % 256;
small[3] = large & 255;
small[3] = static_cast<uint8_t>(large);

有沒有功能上的原因做%&或投自己,但如果你想反正我會感到驚訝,如果編譯器未生成所有四個(gcc和鐺做)相同的代碼。

一個區別是,如果您使用-Wconversion東西進行編譯,這會導致發出警告(這有時可能是有益的)。 在這種情況下,你會想要演員。

暫無
暫無

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

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