0

我正在浏览一些c代码并遇到了这种语法:

uint16 a;
unsigned char *b;
//b is initilized elsewhere before the next line gets called
((unsigned char*) &a)[0] = b[0];

这是我没有得到的最​​后一行。我们将 uint16 的地址类型转换为无符号字符。为什么是这样?&a 的地址可能大于 8 个字节。另外,等号左边的 [0] 是什么意思?

4

3 回答 3

2

您正在获取 的地址a,将其转换为unsigned char*not unsigned char),将 0 添加到它(无操作),取消引用它,然后将结果分配b[0]给它。换句话说,您将结果分配给's 内存表示b[0]的第一个字节。a

由于b尚未初始化,这会调用未定义的行为。

于 2013-09-29T00:47:58.090 回答
2

它复制b[0]a. 哪些具体部分取决于:

  • 字节序:小字节序或大字节序

  • 每种类型的大小(uint16将使用 2 个字节,unsigned char可能是 1 个)。

注意:修改的“字节”a将始终是第一个字节。字节序很重要,因为第一个字节可能是最重要的或最不重要的。

于 2013-09-29T00:48:16.927 回答
0

这在您希望一次使用整个单词进行优化的 int 类型上更为常见。假设您有一大组要比较的字符串,但只需要比较前 4 个字符。您可以将每个 char 数组转换为 int 并进行直接比较,而不是使用一系列缓慢的 strncmp()。一个常见的用途是用于 GET、POST、HEAD... 请求的 Web 服务器。根据您的字节序,转换值可能采用“TSOP”或“POST”的形式,其他类型(包括您的 uint16)也是如此,因此如果没有一些#ifdefs,您正在使用的代码可能无法移植

注意:如果您只使用“POST”(或“TSOP”)作为比较,您可能会收到有关多字节字符的警告,解决方法(除了关闭警告)是使用 ('P'|'O'<<8 |'S'<<16|'T'<<24) 或反之亦然,具体取决于字节顺序 - 它将编译为可在 switch() 中使用的 const int。

于 2013-09-29T03:32:49.957 回答