指针位大小

POINTER bit size

CODESYS documentation

The result of the difference between two pointers is of type DWORD, even on 64-bit platforms, when the pointers are 64-bit pointers.

据此,我猜测codesys中的指针在x86平台上是32位的,在x64平台上是64位的。这是真的吗?

我在模拟模式下尝试了 运行 CODESYS_Control_Win_V3CODESYS_Control_Win_V3 x64 (CODESYS 3.5 SP16),在这两种情况下,指针都是 64-位,但我没有真正的 x84 PLC(只有 x64)所以我无法在真实设备上验证这一点。有人可以用 x86 PLC 测试这个并给我他们的结果吗?

编辑:奇怪的是,我打开了 2 个单独的项目,我都尝试了 ptr := ptr + {some DINT variable};,其中一个收到警告 Implicit conversion from signed Type 'DINT' to unsigned Type 'LWORD',而另一个收到 [=15] =]:

EDIT2:我在一个测试项目中试过这个:

    p: POINTER TO STRING := ADR(str);
    pp: POINTER TO POINTER TO STRING := ADR(p);
    sizep: DINT := SIZEOF(p);     // evaluates to 8
    sizepp: DINT := SIZEOF(pp);   // evaluates to 8

这是否意味着它们总是 8 个字节?

指针的大小在 32 位运行时为 4 字节,在 64 位运行时为 8 字节。

您在文档中找到的句子只是说,当您执行 2 个指针的差值时,编译器需要一个 DWORD。 意思是,当你尝试做这样的事情时,你会收到警告:

diTest := pTest - pTest2;

diTest 是一个 DINT,pTest 和 pTest2 是两个指针。

这也意味着如果您使用 DWORD 作为 64 位系统上 2 个指针差异的结果赋值,您可能会丢失一些信息。 事实上你会丢失 4 个字节。

DWORD 是 4 个字节长,64 位系统上的指针是 8 个字节长。

为了以跨平台的方式存储指针地址,请使用 PVOID 类型,它在 32 位系统上为 4 个字节,在 64 位系统上为 8 个字节。 PVOID 在 CAA 类型库中可用。

或者,您可以使用 __XWORD,因为 PVOID 是 __XWORD 的别名,它在 64 位平台上转换为 LWORD,在 32 位平台上转换为 DWORD platforms.platforms。