标签: integer-arithmetic

进入和退出C#检查块是否需要付费?

考虑这样的循环:

for (int i = 0; i < end; ++i)
    // do something
Run Code Online (Sandbox Code Playgroud)

如果我知道不会溢出,但我想要检查溢出,截断等,在"做某事"部分,我最好使用checked循环内部或外部的块?

for (int i = 0; i < end; ++i)
    checked {
         // do something
    }
Run Code Online (Sandbox Code Playgroud)

要么

checked {
    for (int i = 0; i < end; ++i)
         // do something
}
Run Code Online (Sandbox Code Playgroud)

更一般地说,在已检查和未检查模式之间切换是否需要付费?

c# integer-arithmetic

29
推荐指数
3
解决办法
1259
查看次数

为什么ushort + ushort等于int?

以前我今天尝试添加两个ushorts,我注意到我必须将结果反馈给ushort.我认为它可能会成为一个uint(以防止可能的意外溢出?),但令我惊讶的是它是一个int(System.Int32).

是否有一些聪明的理由或者是因为i​​nt被视为'基本'整数类型?

例:

ushort a = 1;
ushort b = 2;

ushort c = a + b; // <- "Cannot implicitly convert type 'int' to 'ushort'. An explicit conversion exists (are you missing a cast?)"
uint d = a + b; // <- "Cannot implicitly convert type 'int' to 'uint'. An explicit conversion exists (are you missing a cast?)"

int e = a + b; // <- Works!
Run Code Online (Sandbox Code Playgroud)

编辑:就像GregS的回答所说,C#规范说两个操作数(在这个例子中是'a'和'b')应该转换为int.我对为什么这是规范的一部分的根本原因感兴趣:为什么C#规范不允许直接对ushort值进行操作?

c# types integer-arithmetic

28
推荐指数
3
解决办法
1万
查看次数

如何在32位int上检测整数溢出?

我知道这样的话题被问过好几次,但我的问题是关于整个32位int的溢出.例如:

  11111111111111111111111111111111 +
  00000000000000000000000000000001 =
  00000000000000000000000000000000   //overflow!
Run Code Online (Sandbox Code Playgroud)

我找到了类似问题的主题,但算法并不完美.

  11111111111111111111111111111111 +
  00000000000000000000000000000000 =
  00000000000000000000000000000000  //overflow!
Run Code Online (Sandbox Code Playgroud)

有没有简单快捷的方法来检查这个?

java integer bit-manipulation integer-overflow integer-arithmetic

25
推荐指数
3
解决办法
2万
查看次数

算术溢出是否等效于模运算?

我需要在C中进行模256运算.所以我可以简单地做

unsigned char i;
i++;
Run Code Online (Sandbox Code Playgroud)

代替

int i;
i=(i+1)%256;
Run Code Online (Sandbox Code Playgroud)

c overflow modulo integer-arithmetic

25
推荐指数
4
解决办法
2375
查看次数

将任意大小的整数从Prolog传递到C.

现在,我正在学习如何使用C代码连接SICStus Prolog.

我想在SICStus Prolog版本4中使用/使用/查看任意大小的整数的"汉明重量"的C实现.

在我看来,我需要C函数来测试术语类型(SP_is_integer)和C函数来访问Prolog术语(SP_get_integer,SP_get_integer_bytes).

但是,我不确定如何以便携,健壮的方式使用SP_get_integer_bytes.你能指点一些精心设计的C代码做到这一点吗?

c prolog ffi sicstus-prolog integer-arithmetic

25
推荐指数
1
解决办法
382
查看次数

为什么不同的求和算法不匹配?

假设我想得到从M到N的所有方块的总和.我用Google搜索了一下,发现了这个公式:

(1 ^ 2 + 2 ^ 2 + 3 ^ 2 + ... + N ^ 2)=(N*(N + 1)*(2N + 1))/ 6

所以我写这段代码:

static void Main(string[] args)
{
    const int from = 10;
    const int to = 50000;
    Console.WriteLine(SumSquares(from, to));
    Console.WriteLine(SumSquares2(from, to));
}

static long SumSquares(int m, int n)
{
    checked
    {
        long x = m - 1;
        long y = n;
        return (((y*(y + 1)*(2*y + 1)) - (x*(x + 1)*(2*x + 1)))/6);
    }
}

static long SumSquares2(int …
Run Code Online (Sandbox Code Playgroud)

.net c# algorithm math integer-arithmetic

18
推荐指数
2
解决办法
1738
查看次数

当通过列表向后循环时,惊慌失措'尝试减去溢出'

我正在编写一个循环方法,用于向索引向前或向后移动索引.以下代码用于向后循环:

(i-1)%list_length
Run Code Online (Sandbox Code Playgroud)

在这种情况下,i属于类型usize,这意味着它是无符号的.如果i等于0,则会导致"尝试减去溢出"错误.我尝试使用正确的转换方法来解决此问题:

((i as isize)-1)%(list_length as isize)) as usize
Run Code Online (Sandbox Code Playgroud)

这导致整数溢出.

我理解错误发生的原因,目前我通过检查索引是否等于0来解决问题,但我想知道是否有某种方法可以通过将变量转换为正确的类型来解决它.

integer-overflow rust integer-arithmetic

18
推荐指数
2
解决办法
9885
查看次数

787有什么特别之处?

在ghci中,使用arithmoi包:

Math.NumberTheory.Powers.General> :set +s
Math.NumberTheory.Powers.General> integerRoot 786 ((10^32)^786)
100000000000000000000000000000000
(0.04 secs, 227,064 bytes)
Math.NumberTheory.Powers.General> integerRoot 787 ((10^32)^787)
Run Code Online (Sandbox Code Playgroud)

五分钟后,它仍然没有回应.为什么需要这么长时间?

(从一些临时测试来看,对于大于787的所有选择来说似乎都很慢,并且对于所有选择较小的选择都很快.)

haskell integer-arithmetic

18
推荐指数
1
解决办法
527
查看次数

有效地检测有理数是相等的

我有许多有理数的集合,每个有的分子和分母存储为一个大的(数百或数千位)无符号整数.我希望能够有效地测试a/b集合中任何给定的有理数是否等于集合中的任何其他有理数c/d.

a*d == b*c当然,最直接的方法是测试是否比计算完整产品更有效.

关于我的特定用例的一些注释:

  • 我将测试的对很可能实际上是相等的(因为我已经预先计算并首先通过它们的浮点近似来比较它们),所以如果它们不相等的早期外出将不会为我节省很多时间.
  • 我很好地预先计​​算了每个数字的额外数据,但每个数字只会用于少数比较,因此昂贵的预计算(例如素数因子分解)可能不值得.
  • 偶尔的假阴性会很好,但误报不是.

我认为这在理论上可能是不可能的,但为了以防万一,将它扔到蜂巢头脑中.

biginteger rational-numbers integer-arithmetic

16
推荐指数
1
解决办法
272
查看次数

可以通过消除> =比较的需要,对无符号整数进行类型惩罚,使得边界检查更快吗?

假设我的程序中有一个非常性能关键的循环,我需要检查一个点是否在矩形内,但我知道在编译时下限始终为0,如下所示: (x >= 0 && y >= 0 && x < width && y < height)

我可以消除前两个比较的类型双关x和y的无符号整数(例如喜欢的东西reinterpret_cast<>()union用C++),因为符号位将保证任何负数会变成一个unsigned int足够大的失败边界检查?如果是这样,您将如何用C++或其他语言实现它?这样做可以获得任何性能提升吗?

c++ int performance type-punning integer-arithmetic

12
推荐指数
1
解决办法
513
查看次数