我有一个80个元素的char
数组,我正在尝试将特定元素添加到integer
,并且会出现一些数字错误。
十六进制的数组元素40是 0xC0 。当我尝试将其分配给integer
时,我得到了十六进制 0xFFFFC0 ,我不知道为什么。
char tempArray[80]; //Read in from file, with element 40 as 0xC0
int tempInt = (int)tempArray[40]; //Output as 0xFFFFC0 instead of 0x0000C0
答案 0 :(得分:14)
根据您的实施情况,C ++中的char
类型 一个signed
类型或一个{ {1}}类型。 (C ++标准要求实现选择任一方案)。
为了安全起见,请在您的情况下使用unsigned
。
答案 1 :(得分:3)
之所以如此,是因为char
被视为签名号码,而int
的促销会保留该号码。将数组从char
更改为unsigned char
以避免它。
答案 2 :(得分:3)
因为0XC0
中的char
为否定,并且演员将该符号保留为int
。如果要保持直接二进制转换或纯正值
unsigned char
答案 3 :(得分:1)
为了更方便,我总是在声明和转换之前使用unsigned
和signed
。你可以写下面的内容:
unsigned char tempArray[80]; //Read in from file, with element 40 as 0xC0
unsigned int tempInt = (unsigned int)tempArray[40]; //Output as 0xFFFFC0 instead of 0x0000C0
答案 4 :(得分:0)
char
可能会被签名,因此从负char
值转换将导致负int
值,这通常用二进制补码表示,从而产生非常高的二进制表示
相反,要么使用int tempInt = 0xFF & tempArray[40]
,要么将tempArray定义为unsigned char
,要么强制转换为unsigned char
:int tempInt = (unsigned char)tempArray[40]
(不确定这是否是已定义的行为)。