飞镖的最大/最小整数/双精度值是否有常数?

Rém*_*let 7 dart

飞镖中是否有一个常数告诉我们最大/最小整数/双精度值是多少?

有点像,double.infinity但是double.maxValue呢?

Ude*_*esh 14

dart 中的最大 int 值:

const int maxValue = -1 >>> 1;

print(maxValue);
Run Code Online (Sandbox Code Playgroud)

输出 :

9223372036854775807
Run Code Online (Sandbox Code Playgroud)

逻辑:

-1 在内部以二进制格式表示:11111111 11111111 11111111 ... 11111111

>>>是按位右移补零运算符。

按位右移零填充运算符会将位移向右侧并从左侧填充零。

语法为>>>

number >>> times_to_shift;
Run Code Online (Sandbox Code Playgroud)

所以在这个表达式中-1 >>> 1 -1数字1times_to_shift,因此 >>>运算符会将二进制值-1向右移动一次。运算后结果值为:

01111111 11111111 11111111 ... 11111111

请注意,这些位会移向右侧,并且从左侧填充零,这是最大整数值


小智 10

不,

Dart 没有内置常量来表示最大值int

但这是获得最大值的方法

因为ints 在 Dart 中是有符号的,所以如果是 32 位,它们的范围(包括)为 [-2^31, 2^31-1];如果是 64 位,则范围为 [-2^63, 2^63 - 1]。an 中的第一位int称为“符号位”。如果符号位为1,则为int负;如果为 0,则int为非负数。在 max 中int,除了符号位为 0 之外,所有位均为 1。我们可以通过编写int十六进制表示法(前面带有“0x”的整数是十六进制)来最轻松地实现这一点:

int max = 0x7fffffff; // 32-bit
int max = 0x7fffffffffffffff; // 64-bit
Run Code Online (Sandbox Code Playgroud)

在十六进制(aka hex)中,每个十六进制数字指定一组 4 位,因为有 16 个十六进制数字(0-f),有 2 位数字(0-1),并且 2^4 = 16。如果指定的位数多于位数,则编译错误;如果指定的位数少于位数,则十六进制整数将用 0 填充,直到位数等于位数。因此,为了指示除符号位之外的所有位均为 1,我们需要使用bitness / 4十六进制字符(例如,64 位架构为 16)。第一个十六进制字符将表示二进制整数“0111”(7),即0x7,所有其他十六进制字符将表示二进制整数“1111”(15) 或0xf

或者,您可以使用位移位,我不会解释这一点,但请随意 Google 一下。

int bitness = ... // presumably 64
int max = (((1 << (bitness - 2)) - 1) << 1) + 1;
Run Code Online (Sandbox Code Playgroud)


Gün*_*uer 8

因为double

double.maxFinite1.7976931348623157e+308
double.minPositive5e-324

在Dart 1中,没有这样的数字int。整数的大小仅受可用内存的限制

在Dart 2 int中限制为64位,但是看起来还没有常量。

对于dart2js,适用不同的规则

因此,在编译为JavaScript时,整数被限制为53个有效位,因为所有JavaScript数字都是双精度浮点值。

  • 请注意,`1 &lt;&lt; 63` 不可移植,因为它不适合 Web,而 Dart 不使用 64 位整数。 (3认同)
  • 我正要用这句话回答我自己的问题。谢谢哈哈! (2认同)
  • 我使用 `1&lt;&lt;63`,它的可读性不是很好,但它很简洁,一条注释就足以解释它 (2认同)

Pin*_*rji 5

我从dart_numerics包中找到了这个。

在此处输入图片说明


Moa*_*idt 5

这是 int64 最大值:

const int intMaxValue = 9223372036854775807;
Run Code Online (Sandbox Code Playgroud)

对于飞镖网络是 2^53-1:

const int intMaxValue = 9007199254740991;
Run Code Online (Sandbox Code Playgroud)

“这个数字背后的原因是 JavaScript 使用 IEEE 754 中指定的双精度浮点格式数字,并且只能安全地表示 -(2^53 - 1) 和 2^53 - 1 之间的整数。” 见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER

  • 我相信OP正在询问是否有一个预定义的常量(例如C提供的常量)。 (3认同)