如何将char转换为unsigned int?

时间:2011-10-25 17:12:49

标签: 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;

我无法弄清楚如何做到这一点。我认为这将涉及一些铸造和重铸指针,但我不能让它工作。我怎样才能实现我的目标?

更新

感谢Martin B的快速回复,但这不起作用。具体来说,在我的情况下,两个字节是0x000xbc。显然我想要的是0x000000bc。但是我在unsigned int中得到的是0xffffffbc

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

5 个答案:

答案 0 :(得分:16)

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

如果sizeof(unsigned int) >= 2 * sizeof(unsigned char)(不是C标准保证的话)

现在......这里有趣的事情肯定是操作员的顺序(在很多年里我仍然只能记住+, -, * and / ...对我感到羞耻:-),所以我总是把尽可能多的括号)。 []是王道。第二个是(cast)。第三个是<<,第四个是|(如果您使用+而不是|,请记住+比{{1}更重要所以你需要使用brakets)

我们无需向<<这两个(unsigned integer)转发,因为integral promotion会为我们做一个,而对于另一个它应该是自动的Arithmetic Conversion

如果你想减少头痛,我会补充一下:

(unsigned char)

答案 1 :(得分:4)

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

答案 2 :(得分:1)

字节顺序取决于处理器的字节顺序。你可以这样做,这将适用于大型或小型端机。 (没有ntohs它将适用于big-endian):

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我认为这是一种更好的方法,而不是依赖指针别名:

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