我使用以下内容将a转换char[4]为a uint32_t.
frameSize = (uint32_t)(frameSizeBytes[0] << 24) | (frameSizeBytes[1] << 16) | (frameSizeBytes[2] << 8) | frameSizeBytes[3];
Run Code Online (Sandbox Code Playgroud)
frameSize是一个uint32_t变量,frameSizeBytes是一个char[4]数组.例如,当数组包含以下值时(以十六进制表示)
00 00 02 7b
Run Code Online (Sandbox Code Playgroud)
frameSize设置为635,这是正确的值.此方法也适用于其他字节组合,但以下情况除外
00 00 9e ba
Run Code Online (Sandbox Code Playgroud)
对于这种情况,frameSize设置为4294967226,根据本网站,这是不正确的,因为它应该是40634.为什么会发生这种情况?
您的char类型已在您的特定实现中签名,并与大多数运营商进行整数提升.使用强制转换来使用带unsigned char符号的数组元素.
编辑:实际上正如Olaf在评论中指出的那样,你应该更喜欢强制转换unsigned int(假设共同的32位unsigned int)或者uint32_t避免使用<< 24移位操作的潜在未定义行为.