[英]Should I use C types (uint8_t/…/uint64_t) or (u_int8_t/…/u_int64_t)?
[英]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.