指针位大小
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_V3
和 CODESYS_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。
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_V3
和 CODESYS_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。