C 如何将字符转换为无符号整数?

C 如何将字符转换为无符号整数?,c,pointers,casting,C,Pointers,Casting,我有一个char数组,它实际上用作字节数组,不用于存储文本。在数组中,有两个特定的字节表示我需要存储到无符号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 n

我有一个char数组,它实际上用作字节数组,不用于存储文本。在数组中,有两个特定的字节表示我需要存储到无符号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
。但是我在无符号int中得到的是
0xffffffbc


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

unsigned int val=bytes[0]
unsigned int val=(unsigned char)bytes[0]字节顺序取决于处理器的尾数。您可以这样做,这将在大型或小型endian机器上工作。(如果没有NTOH,它将在big endian上工作):


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

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


我无法抗拒。。。严格来说,当设置
字节[0]
的msb时,这将调用整数溢出(如果
char
默认为
signed
)。在标准中,没有一个字节只有8位:-)@xanatos,没有意识到“`和4spaces格式的代码不同。事实上,我收回了我之前的评论!如果
char
signed
,它就不能正常工作。你不会想使用指针,因为
unsigned int
不太可能与
char[2]
的大小相同。我认为这行不通,因为ntohs读取的字节太多。@MooingDuck,它可以工作,ntohs用于16位值。ntohl代表32位,对。但是,
*(unsigned int*)字节
将读取太多字节。更好,但可能会出现对齐问题。等等,我不认为这个问题和endianness有任何关系…如果你把一个16位指针映射到endianness,你必须担心endianness。如果在小端点上执行(uint16_t),则val==0x880C。在big-endian上,val==0xC88。对齐点是正确的,但是现在很难找到一个处理器不能进行未对齐的访问,即使在嵌入式世界也是如此。严格来说,这仍然依赖于类型别名。@MooingDuck:C99允许通过联合进行类型双关-2007年TC3在第6.5.2.3节中添加了一个脚注,明确了这一点;然而,Chuck的代码假设小端字节顺序移位是可移植的solution@Christoph在C++中是违法的,我的错误。在我的-1被编辑之前,我无法删除它:(@MooingDuck:添加了一个缺少的分号,所以请发射出去;)+1:目前为止唯一正确的答案。不过,转换为
unsigned int
是不必要的。在最后一行,
val |=…
可能更快。您的第一行代码已经解决了问题。不过,我也尝试了发布此问题之前的最后一个片段。这是一个根本不起作用的“解决方案”。@MooingDuck我确实错过了选角,但是
unsigned int val = (unsigned char) bytes[0]<<8 | (unsigned char) bytes[1];
unsigned int val = ntohs(*(uint16_t*)bytes)
unsigned int val = (unsigned char)bytes[0] << CHAR_BIT | (unsigned char)bytes[1];
unsigned int val = (unsigned char)bytes[0] << CHAR_BIT;
val |= (unsigned char)bytes[1];
union {unsigned asInt; char asChars[2];} conversion;
conversion.asInt = 0;
conversion.asChars[0] = 0x0C;
conversion.asChars[1] = 0x88;
unsigned val = conversion.asInt;