Ude*_*esh 14
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是数字,1是times_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)
因为double有
double.maxFinite(1.7976931348623157e+308)
double.minPositive(5e-324)
在Dart 1中,没有这样的数字int。整数的大小仅受可用内存的限制
在Dart 2 int中限制为64位,但是看起来还没有常量。
对于dart2js,适用不同的规则
因此,在编译为JavaScript时,整数被限制为53个有效位,因为所有JavaScript数字都是双精度浮点值。
这是 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
| 归档时间: |
|
| 查看次数: |
2207 次 |
| 最近记录: |