- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据文档(https://golang.org/pkg/unsafe/#Sizeof)unsafe.Sizeof
返回给定表达式的大小(以字节为单位)。理想情况下,任何给定表达式的大小都可以用 uint32
表示。或 uint64
.那为什么 Golang 返回一个 uintptr
反而?这不是很困惑吗?一个 uintptr
应该保存一个指向某个数据值的指针,但在这种情况下,它实际上不是一个指针,它只是一个数字,对吗?
最佳答案
评论中有很多很好的答案,归结为“因为它足够大,但又不太大”。不过,我认为从历史的角度来看这可能会有所帮助,特别注意这一切是如何在 C 编程语言中发生的。
在非常古老的(准标准)C 中,如果您及时回溯,甚至没有明确的 unsigned
整数类型。 PDP-11 具有:
char
, 8 位,有符号; int
, 16 位,有符号;和 int i;
int *u;
你是如何制作两个整数的,
i
正在签名,和
u
未签名。设置
i
到 32767 (0x7fff) 然后增加它给你 -32768 (0x8000),它逐渐增加到 -1 (0xffff) 然后为零。设置
u
到 32767,然后增加它给你 32768,逐渐增加到 65535,然后翻转到零。
struct {
int csr;
int blk;
int bar;
int bcr;
};
0177440->bcr = count;
0177440->blk = block;
0177440->bar = addr;
0177440->csr = READ | GO;
这可能就是告诉设备读取一些字节或 block 的方式。
st_ino
中的
struct stat
都使用这样的前缀:
st_ino
只是表示“一些整数偏移量”,您可以将
st_ino
成员与任何指针一起使用,甚至使用一个普通变量。前缀意味着您可以
#include
多个 header 而不会使其结构成员名称发生冲突。)
unsigned
整数类型,而不是将指针作为无符号整数压入服务,Steve Johnson 的 PCC 编译器转为
unsigned
变成一个修饰符,可以应用于
char
和
short
以及
int
.进行了大量的实验。最终,在 1989 年,C 首次使用我们现在拥有的大部分语法和语义进行了标准化(尽管新标准添加了新类型和许多函数,等等)。
When the three of us [Thompson, Rob Pike, and Robert Griesemer] got started, it was pure research. The three of us got together and decided that we hated C++. [laughter] ... [Returning to Go,] we started off with the idea that all three of us had to be talked into every feature in the language, so there was no extraneous garbage put into the language for any reason.
关于go - 为什么 unsafe.Sizeof 返回一个 uintptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64109708/
在Go的runtime/proc.go中,有一段代码如下所示: // funcPC returns the entry PC of the function f. // It assumes that
我想在 Go 中实现一个弱引用,以便我可以使用终结器来检测何时不再需要数据结构并能够存储/清理数据。 我发现的一种方法是使用 uintptr 作为映射键,这样当调用终结器时,我可以使用传递给终结器函数
这应该很简单:我到处都看到人们使用 IntPtr,我有什么理由应该改用 UIntPtr 吗? 最佳答案 似乎没有充分的理由这样做。来自文档: Remarks ... The IntPtr type i
我只是找不到获取指向给定结构的每个属性的指针片段的方法。我正在使用反射来获取我的指示(感谢 https://stackoverflow.com/a/24348352/6093604 ) if valu
我正在尝试将系统调用与 user32.dll 结合使用以获取剪贴板的内容。我希望它是来自打印屏幕的图像数据。 现在我得到了这个: if opened := openClipboard(0); !ope
我需要将字符串作为参数传递给 golang 中的 C DLL,我想得到这样的东西: proc, e = syscall.GetProcAddress(h, "JLINKARM_ExecComman
我正在查看 RegOpenKeyEx 的 P/Invoke 声明当我注意到页面上的这条评论时: Changed IntPtr to UIntPtr: When invoking with IntPtr
我试过这样转换它: UIntPtr x = (UIntPtr)intPtr; ...但是编译器对此不太满意并返回编译错误。 我需要进行转换,因为 RegOpenKeyEx 的 P/Invoke 签名需
在下面的代码中,Resharper 给我一个警告:Cannot cast expression of type 'Color' to type 'UIntPtr'。 (实际上,Resharper 认为
我在 golang 网站上读到 uintptr 存储指针值的未解释位,我在网上找到的那种答案非常困惑。有人可以用简单的词向我解释一下吗。 最佳答案 简答:当您需要像使用数字一样使用地址时使用它。 Go
根据文档(https://golang.org/pkg/unsafe/#Sizeof)unsafe.Sizeof返回给定表达式的大小(以字节为单位)。理想情况下,任何给定表达式的大小都可以用 uint
给定 // I know that behind SomeInterface can hide either int or a pointer to struct // In the real cod
我尝试使用来自 golang 包的系统调用调用 WindowsAPI(尽量不要使用 cgo),但我面对 uintptr 我不知道如何访问 uintptr 具有其地址的数据 这是我正在做的代码 pack
Go 编程语言在第 13.2 节中说这是代码是安全的并且 x 将始终对垃圾收集器可见: pb := (*int16)(unsafe.Pointer( uintptr(unsafe.Pointer(
根据Golang tour ,我们提供了以下整数类型: int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr 理
我需要在我的 C# .NET 2.0 应用程序中将 UIntPtr 对象转换为 IntPtr 对象。如何做到这一点?我不认为它像这样简单: UIntPtr _myUIntPtr = /* Some i
我不知道怎么办。它不使用 []byte(uintptr(0)) 进行编译。 请给我举个例子。 最佳答案 这取决于您机器的架构(32 位或 64 位)以及您希望如何对其进行编码(小端或大端)。无论哪种方
我正在尝试将在 uintptr 类型的变量中找到的值分配给 Go 中的 uint64 变量。使用 myVar = valFromSystem 给我 cannot use valFromSystem (
这是一个看起来很简单的问题: 鉴于 native 大小的整数最适合算术,为什么 C#(或任何其他 .NET 语言)不支持使用 native 大小的算术 IntPtr和 UIntPtr ? 理想情况下,
我是一名优秀的程序员,十分优秀!