考虑这样的循环:
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)
更一般地说,在已检查和未检查模式之间切换是否需要付费?
以前我今天尝试添加两个ushorts,我注意到我必须将结果反馈给ushort.我认为它可能会成为一个uint(以防止可能的意外溢出?),但令我惊讶的是它是一个int(System.Int32).
是否有一些聪明的理由或者是因为int被视为'基本'整数类型?
例:
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值进行操作?
我知道这样的话题被问过好几次,但我的问题是关于整个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
我需要在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代码连接SICStus Prolog.
我想在SICStus Prolog版本4中使用/使用/查看任意大小的整数的"汉明重量"的C实现.
在我看来,我需要C函数来测试术语类型(SP_is_integer)和C函数来访问Prolog术语(SP_get_integer,SP_get_integer_bytes).
但是,我不确定如何以便携,健壮的方式使用SP_get_integer_bytes.你能指点一些精心设计的C代码做到这一点吗?
假设我想得到从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) 我正在编写一个循环方法,用于向索引向前或向后移动索引.以下代码用于向后循环:
(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来解决问题,但我想知道是否有某种方法可以通过将变量转换为正确的类型来解决它.
在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的所有选择来说似乎都很慢,并且对于所有选择较小的选择都很快.)
我有许多有理数的集合,每个有的分子和分母存储为一个大的(数百或数千位)无符号整数.我希望能够有效地测试a/b集合中任何给定的有理数是否等于集合中的任何其他有理数c/d.
a*d == b*c当然,最直接的方法是测试是否比计算完整产品更有效.
关于我的特定用例的一些注释:
我认为这在理论上可能是不可能的,但为了以防万一,将它扔到蜂巢头脑中.
假设我的程序中有一个非常性能关键的循环,我需要检查一个点是否在矩形内,但我知道在编译时下限始终为0,如下所示: (x >= 0 && y >= 0 && x < width && y < height)
我可以消除前两个比较的类型双关x和y的无符号整数(例如喜欢的东西reinterpret_cast<>()或union用C++),因为符号位将保证任何负数会变成一个unsigned int足够大的失败边界检查?如果是这样,您将如何用C++或其他语言实现它?这样做可以获得任何性能提升吗?