Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Endianness:这个宏在做什么?_C_Endianness - Fatal编程技术网

C Endianness:这个宏在做什么?

C Endianness:这个宏在做什么?,c,endianness,C,Endianness,我在第三方代码中遇到了以下#define: #define Endian_StreamGetLittleInt(ppBytes) \ (int) ((++*(int **)(ppBytes)), \ ( ((*(char **)(ppBytes))[3-sizeof(int)] << 24) \ | ((*(char **)(ppBytes))[2-sizeof(int)] << 16) \ |

我在第三方代码中遇到了以下
#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)])) )
其中
buf
是一个
char*
,它指向以前从文件读取的数据字节数

我理解bitshift部分是在字节数组中重新排列字节,以匹配平台的尾端(或者有人可以纠正我)。然而,我对以下的用法感到困惑:

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

为什么那里有一个逗号?

这里有一个由两个子表达式组成的表达式,由。第一个表达式将指针递增一个整数步。不管指针的实际类型是什么,它都会首先被转换为
int**
,然后被取消引用为
int*
,然后
int*
会递增。因此,指向的地址将更改
sizeof(int)
字节


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

@EitanT,你为什么把my“Or”改为“rr”?int uiSize=(int)(++*(int**)(&buf)),((*(char**)(&buf))[3-sizeof(int)]
(++*(int **)(ppBytes)) ,