C 字符大于一个字节?

C 字符大于一个字节?,c,char,C,Char,我正在从微控制器设备读取char类型的缓冲区,如下所示: char data_buffer[DATA_LEN]; FILE *aq_dev = fopen(argv[1], "r"); fread(data_buffer, 1, DATA_LEN, aq_dev); fclose(aq_dev); 在这个缓冲区blob中有16位无符号整数,每个整数分布在缓冲区中的两个条目上。例如有 data_buffer[10] = 0x07 data_buffer[11] = 0xc3 我想把它读作0

我正在从微控制器设备读取
char
类型的缓冲区,如下所示:

char data_buffer[DATA_LEN];
FILE *aq_dev = fopen(argv[1], "r");

fread(data_buffer, 1, DATA_LEN, aq_dev);

fclose(aq_dev);
在这个缓冲区blob中有16位无符号整数,每个整数分布在缓冲区中的两个条目上。例如有

data_buffer[10] = 0x07
data_buffer[11] = 0xc3
我想把它读作
0x07c3
,等于1987年。尽管我最初认为我可以用
uint16\u t
指针访问缓冲区并直接读取值,但我必须做一些奇怪的位屏蔽:

int value = (buffer[10] << 8) + buffer[11];

int value=(buffer[10]您的问题是
char
在您的平台上签名。因此,如果设置了
buffer[11]
的高位,它将是负值,当您在表达式中使用它时,它将首先升级为(负值)整数,有效地将
字符的高位传播到所有高位

buffer[11]   (char)                0xc3 -61
             (int)           0xffffffc3 -61      // sign-extended
&
-ing与
0xff
一起工作的原因是
char
值在执行
&
操作之前提升为
int

buffer[11]   (char)                0xc3 -61
             (int)           0xffffffc3 -61      // sign-extended
    & 0xff   (int)           0x000000c3 195
修复方法是在执行位操作之前强制转换为
无符号字符

int value = (((unsigned char) buffer[10]) << 8) | ((unsigned char) buffer[11]);

buffer[11]   (char)                0xc3 -61
             (unsigned char)       0xc3 195
             (int)           0x000000c3 195

int value=((无符号字符)缓冲区[10])
char
是有符号的还是无符号的?好吧,我理解你的意思,但是为什么位掩码会起作用呢?&在移位之前对所有8位进行赋值,尤其是高位,是吗?@lynix带符号扩展名的
int
转换发生在任何算术运算之前,包括
&
.
int value = (((unsigned char) buffer[10]) << 8) | ((unsigned char) buffer[11]);

buffer[11]   (char)                0xc3 -61
             (unsigned char)       0xc3 195
             (int)           0x000000c3 195