可以說,我想一個uint32_t的低16位存儲在Windows上的uint16_t,我能做到這一點無論是將大值分配給小值時,是否需要位掩碼?
uint32_t value = 123456789;
uint16_t low1 = value; //like this
uint16_t low2 = value & 0xFFFF; //or this
似乎有在結果沒有差異,但我無法找到任何文件明確指出這是已定義的行爲。在X或Y的情況下會不一樣?或者這只是它的工作原理?
可以說,我想一個uint32_t的低16位存儲在Windows上的uint16_t,我能做到這一點無論是將大值分配給小值時,是否需要位掩碼?
uint32_t value = 123456789;
uint16_t low1 = value; //like this
uint16_t low2 = value & 0xFFFF; //or this
似乎有在結果沒有差異,但我無法找到任何文件明確指出這是已定義的行爲。在X或Y的情況下會不一樣?或者這只是它的工作原理?
C++標準保證分配和無符號類型的初始化爲您提供了價值模2 ñ,其中ñ是無符號類型的值表示中的位數。
在Windows中,所有位參與值表示。
因此,使用位掩碼除了在將來可能會改變某種類型的方式時,會有一點絆腳石之外沒有其他用途。
如果您絕對想使用遮罩,例如避免過度熱心的編譯器編譯警告,那麼你就可以做到這一點在這樣的類型無關的方式,假設類型是unsigned:
uint16_t low2 = value & uint16_t(-1);
依賴於前述模2 n擔保。
使用掩碼「〜0」會更好嗎?對於無符號整型,「-1」不是有效值,並且可能不會爲所有系統生成正確的位掩碼(例如,沒有兩個補碼的嵌入式系統)。 – Rocki
@Rocki:代碼是有效的,*由於陳述的原因*。與你的印象相反(你在地球上獲得它的地方)它總是會產生正確的面具,因爲它是正確的類型。另一方面,'〜0'的類型不正確。 –
@Alf我的意思是'uint16_t low2 = value&uint16_t(〜0);'。今天,幾乎所有的計算機都使用二進制補碼,並且假設-1產生正確的位掩碼是正確的,但想象一下具有補碼的架構,其中uint16_t(-1)導致位掩碼「1111 1111 1111 1110」。 – Rocki
編譯器應該給你一個警告,如果你使用-Wconversion
,value
將被截斷。
warning: conversion to 'uint16_t {aka short unsigned int}' from 'uint32_t {aka unsigned int}' may alter its value [-Wconversion]
uint16_t low1 = value;
^
隨着掩碼G ++不產生警告...
雖然是正確的,但這並不回答問題*是否需要掩碼?* – stijn
可能的重複[當我將long int分配給C中的int時發生了什麼?](http://stackoverflow.com/questions/13652556/what-happens-when-i-assign-long-int-to-int -in-c) –
高位總是被截斷,不需要掩碼 –
[當一個int被轉換爲一個短的和被截斷的,如何確定新的值](http://stackoverflow.com/q/34885966/ 995714) –