我有以下UINT8
个变量:
UINT8 var1 = 0b00000001; //0000 0001
UINT8 var2 = 0b00000011; //0000 0011
UINT8 var3 = 0b00000111; //0000 0111
UINT8 var4 = 0b00001111; //0000 1111
我想将这四个UINT8
变量打包到一个UINT32
变量中,其值如下:
UINT32 var1 = 0b00000001000000110000011100001111; //00000001 00000011 00000111 00001111
以下代码是否会正确安全地执行此操作?
UINT32 var1 = (var1<<24) + (var2<<16) + (var3<<8) + var4;
答案 0 :(得分:7)
简短回答,是。
我不会担心你是如何写二进制数的。我将以十六进制输入它们,让您通过此相关的SO问题查找二进制表示:Can I use a binary literal in C or C++?
#include "stdafx.h" // you are using devstudio
#include <Windows.h> // you are using windows types
#include <iostream> // I print out the result
#include <bitset> // I use bitset to print the binary string
int main()
{
UINT8 var1 = 0x01; //0000 0001
UINT8 var2 = 0x03; //0000 0011
UINT8 var3 = 0x07; //0000 0111
UINT8 var4 = 0x0F; //0000 1111
UINT32 bigvar = (var1 << 24) + (var2 << 16) + (var3 << 8) + var4;
std::cout << std::bitset<32>(bigvar) << std::endl;
}
你的数学是正确和安全的。这些字节是独立声明的,因此您不必担心字节顺序。这些类型都是无符号的,因此符号位没有UB问题。移位都适合正确的位数,因此没有溢出。我生成了:
00000001000000110000011100001111
或者,您可以读取32位整数作为4个字节,并重建32位数,但这不可移植,因为有时数字以相反的顺序存储。例如,在TIFF中,您读入一个标题值,该值告诉您是先将var1放在第一位还是向上计数,或先将var4放在第四位并倒计时。字节顺序是几乎所有将一堆字节组合成更大整数类型的实际应用中必须注意的事项。查看big-endian和little-endian以获取更多信息。