English 简体中文 繁體中文 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french

简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE คนไทย Français русский

回答

收藏

Tact 语言基础 | 整数

开源社区 开源社区 9039 人阅读 | 0 人回复 | 2025-03-23

本帖最后由 riyad 于 2025-3-25 02:43 编辑 - k, Y4 q* P) O( O  s' r. e
4 Y3 u: Z/ I  Q8 B/ o# i6 j; U
TON 智能合约中的算术运算始终使用整数,从不使用浮点数,因为浮点数是不可预测的。 因此,重点应放在整数及其处理上。
Int 是一个 257 位的有符号整数类型。 它能够存储 −2256−2256 和 2256−12256−1 之间的整数。
1 e1 M9 X+ i  {4 u6 c
表示法
Tact 支持多种方式编写 Int 的原始值作为整数字面量。
) _7 R/ t+ V/ B4 F: Z/ G" \# a, L& d0 L
大多数符号允许在数字之间添加下划线 (_),但下列符号除外:

1 C* b5 h7 q; _% K
  • 字符串表示法,如 NanoToncoins 案例所示。
  • 带前导零的十进制数 00。一般不鼓励使用,参见 下文。
    + m8 R6 _5 u+ Y9 x- M! Y& Y8 J

    ! l' C! J4 P$ f, \3 _% B/ U/ V
" P4 j4 Q8 i/ d8 Z
  |  r5 x' {& C; S# e9 ~- D  x2 t

% b% ~; t: A' c+ F此外,不允许在 4__24__2 中连续使用多个下划线,或在 42_42_ 中使用尾部下划线。
0 a7 j/ J. c* w0 f) q- |8 @- p
1 X2 l, w" t. @/ i

7 D$ }; V- c/ K; Z: J& i. u十进制
最常见、最常用的数字表示方法,使用十进制数字系统: 123456789123456789。
% m9 b- \+ b' H! }( @您可以使用下划线(_)来提高可读性: 123_456_789123_456_789 等于 123456789123456789。
或者,您也可以在数字前加上一个 00,这样就禁止使用下划线,只允许使用十进制数字:0123=123.0123=123. 注意,强烈建议使用这种带前导零的符号,因为可能会与 TypeScript 中的八进制整数字面混淆,而 TypeScript 通常与 Tact 一起用于开发和测试合约。
! ~9 r1 ~: x3 _: m- z' X* J( w) c

/ h# `  B6 z# ?+ B9 a1 Q9 @6 F
十六进制
使用十六进制数字系统表示数字,用 0x0x(或 0X0X)前缀表示:0xFFFFFFFFF0xFFFFFFFFF。 使用下划线(_)提高可读性:0xFFF_FFFF_FFF0xFFF_FFFF_FFF 等于 0xFFFFFFFFF0xFFFFFFFFF。
八进制
使用八进制数字系统表示数字,用 0o0o(或 0O0O)前缀表示:0o7777777770o777777777。 使用下划线(_)提高可读性:0o777_777_7770o777_777_777 等于 0o7777777770o777777777。
二进制
使用二进制数字系统表示数字,用 0b0b(或 0B0B)前缀表示:0b1111111110b111111111。 使用下划线(_)提高可读性:0b111_111_1110b111_111_111 等于 0b1111111110b111111111。
NanoToncoins
与美元的运算要求小数点后保留两位小数——这些用于表示美分(cents)的值。 但是,如果我们只能用整数来表示数字 $1.251.25 ,我们该如何表示呢? 解决的办法是直接使用 cents。 这样, $1.251.25 就变成了 125125 美分。 我们只需记住最右边的两位数代表小数点后的数字。
同样,在使用 TON 区块链的主要货币 Toncoin 时,需要九位小数,而不是两位小数。 可以说,nanoToncoin是Toncoin的 1109th1091​th。
因此, 1.251.25 Toncoin 的数量,可以用 Tact 表示为 ton("1.25"),实际上就是数字 12500000001250000000。 我们称这样的数字为_nanoToncoin(s)(或_nano-ton(s))而不是_美分
序列化
将 Int 值编码为持久状态(contractstraits 的字段)时,通常最好使用比 257257-bits 更小的表示形式,以降低存储成本。 这些表示法的使用也被称为 “序列化”,因为它们代表了 TON 区块链运行的本地TL-B类型。
持久状态大小在状态变量的每个声明中都会在 as关键字后指定:
  1. contract SerializationExample {/ c$ P; m1 G( x0 X- r
  2.     // persistent state variables* ~9 X5 L3 o6 B  ^
  3.     oneByte: Int as int8 = 0; // ranges from -128 to 127 (takes 8 bit = 1 byte)% a; R# ?; O- I" ]9 k2 o* u
  4.     twoBytes: Int as int16;   // ranges from -32,768 to 32,767 (takes 16 bit = 2 bytes)
    . _# e1 C; H7 w0 Y( ?4 p3 `: W

  5. 2 R$ D2 O2 D  M: M9 `# k( F  `" \( u
  6.     init() {' H8 c& j2 y8 M9 W. \
  7.         // needs to be initialized in the init() because it doesn't have the default value" Z  c  N% s" v
  8.         self.twoBytes = 55*55;. V4 i' o. H9 W4 u! Q% {
  9.     }
    ; p6 F+ h5 r$ f$ Q1 |
  10. }
复制代码

. Z1 g: G% m9 {: Y  b/ {
整数序列化也适用于 Structs 和 Messages 的字段,以及 maps 的键/值类型:

7 t+ N! J5 [  w# ]' }( T7 U
  1. struct StSerialization {* M4 F/ o5 o2 n+ n7 T! k% A% |
  2.     martin: Int as int8;
    1 c1 ]8 y' {9 a. ]1 u0 b
  3. }
    ( ^3 u7 l/ {0 A- [* d$ y1 s

  4. 3 U  a6 p/ ~# U3 q1 e8 S
  5. message MsgSerialization {
    6 Y- I$ V8 n4 A5 y" Q- m
  6.     seamus: Int as int8;
    0 M" T! S5 Y- i# `9 ^
  7.     mcFly: map<Int as int8, Int as int8>;
    9 x% x: s3 o/ j
  8. }
复制代码
动机很简单:
  • 在状态中存储 10001000 个 257257 位的整数成本大约为每年 0.1840.184 TON。
  • 相比之下,存储 10001000 3232-bit 整数每年只需花费 0.0230.023 ton 。5 I, e; S1 v7 I+ Q8 ^

! m+ `5 C7 p5 m6 w( b1 W/ I& s
7 a0 f7 w+ T0 ?

  l: y, h; V( x3 C* U% }2 H5 X: h  Z9 E# e
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则