2016-03-26 24 views
4

可以說,我想一個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的情況下會不一樣?或者這只是它的工作原理?

+0

可能的重複[當我將long int分配給C中的int時發生了什麼?](http://stackoverflow.com/questions/13652556/what-happens-when-i-assign-long-int-to-int -in-c) –

+2

高位總是被截斷,不需要掩碼 –

+0

[當一個int被轉換爲一個短的和被截斷的,如何確定新的值](http://stackoverflow.com/q/34885966/ 995714) –

回答

2

C++標準保證分配和無符號類型的初始化爲您提供了價值模2 ñ,其中ñ是無符號類型的值表示中的位數。

在Windows中,所有位參與值表示。

因此,使用位掩碼除了在將來可能會改變某種類型的方式時,會有一點絆腳石之外沒有其他用途。


如果您絕對想使用遮罩,例如避免過度熱心的編譯器編譯警告,那麼你就可以做到這一點在這樣的類型無關的方式,假設類型是unsigned:

uint16_t low2 = value & uint16_t(-1); 

依賴於前述模2 n擔保。

+2

使用掩碼「〜0」會更好嗎?對於無符號整型,「-1」不是有效值,並且可能不會爲所有系統生成正確的位掩碼(例如,沒有兩個補碼的嵌入式系統)。 – Rocki

+0

@Rocki:代碼是有效的,*由於陳述的原因*。與你的印象相反(你在地球上獲得它的地方)它總是會產生正確的面具,因爲它是正確的類型。另一方面,'〜0'的類型不正確。 –

+0

@Alf我的意思是'uint16_t low2 = value&uint16_t(〜0);'。今天,幾乎所有的計算機都使用二進制補碼,並且假設-1產生正確的位掩碼是正確的,但想象一下具有補碼的架構,其中uint16_t(-1)導致位掩碼「1111 1111 1111 1110」。 – Rocki

0

編譯器應該給你一個警告,如果你使用-Wconversionvalue將被截斷。

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 ++不產生警告...

+0

雖然是正確的,但這並不回答問題*是否需要掩碼?* – stijn

相關問題