在我调用C函数的Go程序中,我可以成功地从int
转换为ptrdiff_t
。 (即使Go类型对于任何现代体系结构来说都太小,偶数int8
也会成功编译。)但是*int
到*ptrdiff_t
会产生编译器错误:cannot convert <varname> (type *int) to type *_Ctype_ptrdiff_t
。唯一允许成功编译的类型是int64
。我意识到我可以将我的变量声明为(*)C.ptrdiff_t,但我想了解相应的Go类型以及此实例中Go编译器的意外行为?
答案 0 :(得分:2)
ptrdiff_t是特定大小的整数类型。将另一个整数类型转换为ptrdiff_t时,编译器会重新调整整数大小。换句话说,它更改旧整数的内存表示以匹配新类型。然后将这个新表示放在内存中的不同位置。
指针是内存中的一个位置。因此,您只能转换为指向相同内存布局的类型。 int64与ptrdiff_t的大小相同,因此内存表示相同,指针可以自由转换。
如果您希望转换任意整数类型,您需要首先更改其内存表示形式,并通过将其分配给变量并获取其指针来为其指定新位置。
newtype := ptrdiff_t(oldInt)
pnewtype := &newtype