# NumPut

将一个或多个数字以二进制格式存储到指定地址+偏移的位置.

    NumPut Type, Number, Type2, Number2, ... Target , Offset

## 参数

Type

  类型: 字符串

  下列字符串的其中一个: UInt, UInt64, Int, Int64, Short, UShort, Char, UChar, Double, Float, Ptr 或 UPtr

  对于所有整数类型, 或者在传递纯整数时, 有符号与无符号并不影响结果, 因为使用了二进制补码来表示有符号整数.

  作为原义字符串使用时, 这些类型名必须用引号括起来.

  有关详情, 请参阅 DllCall 类型.

Number

  类型: 整数

  要保存的数字.

Target

  类型: 对象或整数

  类缓冲对象, 内存地址.

  可以使用任何实现 Ptr 和 Size 属性的对象, 但此函数针对原生的缓冲对象进行了优化. 传递具有这些属性的对象可确保函数不会将内存写入无效位置; 这样做可能会导致崩溃或其他不可预测的行为.

Offset

  类型: 整数

  如果未设置或省略, 默认为 0. 否则, 请指定一个单位为字节的偏移, 将其加到 Target 以确定目标地址. 如果省略, 则默认为 0.

## 返回值

类型: 整数

函数返回最后写入的项右边的地址. 这在写入一个不连续的数字序列时, 例如在 DllCall 中使用的结构, 有些字段没有被设置, 就可以使用这个函数. 但是, 在许多情况下, 指定多个 Type, Number 对更简单有效. 将地址传回 NumPut 比传给一个具有更新的 Offset 的类 Buffer 对象更不安全.

## 一般说明

可以在第一个 Number 之后, 通过重复任意次数的 Type 和 Number 来写入数字序列. 每个数字都写入前一个数字之后的下一个字节, 不带填充. 创建用于 DllCall 的结构时, 请注意, 由于数据对齐要求, 某些字段可能需要添加显式填充.

如果整数太大而无法放入指定的 Type, 那么它的高位会被忽略; 例如 `NumPut("Char", 257, buf)` 将存储数字 1.

如果目标地址无效, 则可能抛出异常. 但是, 一些无效地址不能被检测到, 并可能导致不可预知的行为. 传递缓冲对象而不是地址可以确保目标地址总是可以得到验证.

## 相关

NumGet, DllCall, Buffer 对象, VarSetStrCapacity

dftg