gpt4 book ai didi

c - Endianness:这个宏在做什么?

转载 作者:行者123 更新时间:2023-12-04 12:27:01 25 4
gpt4 key购买 nike

我在第三方代码中遇到了以下 #define:

#define Endian_StreamGetLittleInt(ppBytes)  \
(int) ((++*(int **)(ppBytes)), \
( ((*(char **)(ppBytes))[3-sizeof(int)] << 24) \
| ((*(char **)(ppBytes))[2-sizeof(int)] << 16) \
| ((*(char **)(ppBytes))[1-sizeof(int)] << 8) \
| ((*(char **)(ppBytes))[0-sizeof(int)])) )

它的用法如下:

int uiSize = Endian_StreamGetLittleInt(&buf);

其中 buf 是一个 char *,它指向先前从文件中读取的数据字节数。

我将 bitshift 部分理解为重新排列字节,因为它们出现在字节数组中以匹配平台的字节顺序(或者也许有人可以纠正我)。但是,我对以下内容的使用感到困惑:

(++*(int **)(ppBytes)) ,

为什么那里有一个逗号?

最佳答案

您拥有的是一个由两个子表达式组成的表达式,由 comma operator 连接.第一个表达式将指针递增一个整数步长。无论指针的实际类型如何,它都会首先转换为 int**,然后解引用为 int*int*然后递增。因此,指向的地址将改变 sizeof(int) 个字节。

由于逗号运算符总是先执行它的第一个参数,然后返回它的第二个参数的值,所以你首先看到的是增量,然后是值计算。但如果仔细观察,您会发现第二个参数确实使用了负索引,因此它将引用指针在递增之前指向的数字。

关于c - Endianness:这个宏在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11291150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com