RLH*_*RLH 11 c pointers casting
我有一个char数组,它实际上用作字节数组而不是用于存储文本.在数组中,有两个特定的字节表示我需要存储到unsigned 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;
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何做到这一点.我认为这将涉及一些铸造和重铸指针,但我不能让它工作.我怎样才能实现我的最终目标?
UPDATE
感谢Martin B的快速反应,但这不起作用.具体来说,在我的情况下,两个字节是0x00和0xbc.显然我想要的是0x000000bc.但是我在unsigned int中得到的是0xffffffbc.
Martin发布的代码是我的实际原始代码,只要所有字节都小于128(.ie正符号char值),它就能正常工作.
xan*_*tos 16
unsigned int val = (unsigned char)bytes[0] << CHAR_BIT | (unsigned char)bytes[1];
Run Code Online (Sandbox Code Playgroud)
这个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];
Run Code Online (Sandbox Code Playgroud)