如何将 char 转换为 unsigned int?

问题描述 投票:0回答:6

我有一个字符数组,它实际上用作字节数组,而不是用于存储文本。在数组中,有两个特定的字节表示我需要存储到无符号 int 值中的数值。 下面的代码解释了设置。

char* bytes = bytes[2];
bytes[0] = 0x0C; // For the sake of this example, I'm 
bytes[1] = 0x88; // assigning random values to the char array.

unsigned int val = ???; // This needs to be the actual numeric 
                        // value of the two bytes in the char array.  
                        // In other words, the value should equal 0x0C88;

我不知道该怎么做。 我认为这会涉及到一些指针的转换和重新转换,但我无法让它工作。 我怎样才能实现我的最终目标?

更新

感谢 Martin B 的快速回复,但这不起作用。 具体来说,在我的例子中,两个字节是

0x00
0xbc
。 显然我想要的是
0x000000bc
。 但我在 unsigned int 中得到的是
0xffffffbc

Martin 发布的代码是我实际的原始代码,只要所有字节都小于 128(即正符号字符值),它就可以正常工作。

c pointers casting
6个回答
17
投票
unsigned int val = (unsigned char)bytes[0] << CHAR_BIT | (unsigned char)bytes[1];

这个 if

sizeof(unsigned int) >= 2 * sizeof(unsigned char)
(C 标准不保证)

现在...这里有趣的事情肯定是运算符的顺序(多年来我仍然只记得

+, -, * and /
...对我感到羞耻:-),所以我总是放尽可能多的括号)。
[]
是国王。第二个是
(cast)
。第三个是
<<
,第四个是
|
(如果您使用
+
而不是
|
,请记住
+
<<
更重要,因此您需要刹车)

我们不需要向上转换为

(unsigned integer)
这两个
(unsigned char)
,因为有积分提升可以为我们做这件事,而对于另一个,它应该是自动的算术转换

如果您想减少头痛,我会补充一点:

unsigned int val = (unsigned char)bytes[0] << CHAR_BIT;
val |= (unsigned char)bytes[1];

4
投票
unsigned int val = (unsigned char) bytes[0]<<8 | (unsigned char) bytes[1];

2
投票

字节顺序取决于处理器的字节顺序。 您可以执行此操作,这适用于大端或小端机器。 (没有 ntohs 它将在大端上工作):

unsigned int val = ntohs(*(uint16_t*)bytes)

0
投票
unsigned int val = bytes[0] << 8 + bytes[1];

0
投票

我认为这是比依赖指针别名更好的方法:

union {unsigned asInt; char asChars[2];} conversion;
conversion.asInt = 0;
conversion.asChars[0] = 0x0C;
conversion.asChars[1] = 0x88;
unsigned val = conversion.asInt;

0
投票

我永远不知道编译器将通过隐式转换在幕后做什么,所以我通常尝试使用显式按位运算。例如:

unsigned int val = 0;
val |= bytes[0]<<8;
val |= bytes[1];

这里我使用的是按位或,当用于保持值 0 的变量时,它基本上复制了位。 您可以随意修改它来更改字节顺序或您想要执行的任何其他格式。

© www.soinside.com 2019 - 2024. All rights reserved.