您的示例存在问题-实际上是您尝试做的事情有问题(因为您不想进行转换)。
您知道吗,其实这是一个鲜为人知的事实,但您不能以这种方式切换指针类型
具体来说,像这样的代码是非法的:
type1 *vec1=...;
type2 *vec2=(type2*)vec1;
// do stuff with *vec2
仅当type2为char(或unsigned char或const char等)时,此操作才合法。但如果type2是其他类型(如您示例中的uint32_t),则违反了标准,并且如果使用-O2或-O3优化编译,则可能引入代码bug。
这被称为“强类型别名规则”,它允许编译器假定不同类型的指针永远不会指向内存中的相关点 - 因此,如果更改一个指针的内存,编译器无需重新加载所有其他指针。
编译器很难找到违反此规则的实例,除非您明确告诉它。例如,如果将代码更改为执行以下操作:
uint32_t v4full=*((uint32_t*)v4)
如果使用
-O3 -Wall
进行编译(我使用的是gcc),你会收到以下警告信息:
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
所以你不能避免使用shift键。
注意:在较低的优化设置下,它将正常工作,并且如果您从未将信息指针更改为“v4”和“v4_full”,它也将在较高的设置中正常工作。它可以工作,但仍然是一个错误,仍然“违反规则”。
v4
看作是uint8_t v4 [4]
,您想将其作为单个32位数字获取吗? - Floris