我正在浏览一些c代码并遇到了这种语法:
uint16 a;
unsigned char *b;
//b is initilized elsewhere before the next line gets called
((unsigned char*) &a)[0] = b[0];
这是我没有得到的最后一行。我们将uint16的地址类型化为unsigned char。为什么是这样? & a的地址可能大于8个字节。还有什么是等于左边的[0]?
答案 0 :(得分:2)
您正在使用a
的地址,将其投放到unsigned char*
(不 unsigned char
),向其添加0(无操作) ,取消引用它,然后将b[0]
的结果分配给它。换句话说,您将b[0]
的结果分配给a
的内存中表示的第一个字节。
由于b
尚未初始化,因此会调用未定义的行为。
答案 1 :(得分:2)
将b[0]
复制到a
的一部分。具体部分取决于:
Endianness:小端或大端
每种类型的大小(uint16
将使用2个字节,unsigned char
可能使用1个。
注意:a
中修改的“byte”将始终是第一个字节。字节序很重要,因为第一个字节可能是最有意义的或不那么有意义的。
答案 2 :(得分:0)
这在int类型中更常见,您希望一次使用整个单词进行优化。假设您要比较一大组字符串,但只需要比较前4个字符。您可以将每个char数组转换为int并进行直接比较,而不是使用一系列缓慢的strncmp()。 Web服务器中常见的用于GET,POST,HEAD ...请求。根据您的字节顺序,强制转换值可能采用“TSOP”或“POST”形式,其他类型(包括您的uint16)也是如此,因此您使用的代码可能没有一些#ifdefs
便携注意:如果您只是使用'POST'(或'TSOP')作为比较,您可能会收到有关多字节字符的警告,解决方法(除了转动警告之外)就是使用('P'|'O' << 8 |'S'<< 16 |'T'<<<<<<<<<"< 16 |'T'<<<<<<<<< 16"<<<<<< 16> p>