我如何定义一个检查过的整数的列表
我有一个像往常一样定义为List myIntList = new List();的整数列表,我将使用myIntList.Add()方法向列表添加值.我面临的问题是列表中的值是动态的(某些计算的结果)可能超过整数可以保留的最大值. 考虑以下方案: int x = int.MaxValue; myIntList.Add(x + 1); 这会将-2147483648添加到列表中,而不是抛出异常.我需要在这里提出一个例外.我知道在 checked { myIntList.Add(12); myIntList.Add(int.MaxValue); myIntList.Add(x + 1); } 这是我的问题有其他选择吗?我可以定义检查整数列表吗?如果添加到列表超过限制的情况下,我该如何制作一个列出异常的列表? 更新: 感谢大家的回复,大多数人建议在将它们添加到列表
10 2024-04-21
编程技术问答社区
-1 * int.MinValue == int.MinValue?这是个错误吗?
在C#中我看到 -1 * int.MinValue == int.MinValue 这是一个错误吗?当我试图实施搜索树时,这确实使我陷入困境.我最终使用(int.MinValue + 1),以便可以正确否定它. 解决方案 这不是错误. int.MinValue * -1 IS 1大于int.MaxValue可以保持.因此,数字绕回int.MinValue. 这基本上是由整数溢出引起的. /a> 这个常数的值是-2,147,483,648 /a> 该常数的值是2,147,483,647 so,-2,147,483,648 * -1 = 2,147,483,648 1大于Int32.MaxValue. 其他解决方案 这不是一个错误,它是溢出. 在 two的补充表示,可代表数字的空间不是对称的.最小整数的相反无法表示.计算它溢出并再次为您提供相同的数字. 其他解决方案 int i = -1 * int.MinVa
0 2024-04-17
编程技术问答社区
为什么C#对ushorts上的modulo算术发出 "不能隐式转换int为ushort "的错误?
在另一个线程中,有人问为什么要在C#中添加两个ushort值增加错误.例如 ushort x = 4; ushort y = 23; ushort z = x+y; // ERROR cannot implicitly convert int to ushort 在该线程上,人们认为Plus + Operater默认情况下需要两个INT,这是一种语言功能,可帮助避免算术溢出.但是我在以下功能中遇到了同样的错误: public RGB(ushort red, ushort green, ushort blue) { // this class RGB has three ushort fields: r, g, and b r = red % ((ushort)256); g = green % ((ushort)256); b = blue % ((ushort)256); } 编译器错误并说"不能隐式将'int'转换为'ushor
2 2024-04-15
编程技术问答社区
两个大数之间的区别 C#
少量的解决方案已经有解决方案: 这里: 2个数字之间的差异 在这里: c#函数两个数字 在这里:我如何找到c#? 中的2个值之间的区别 我将总结他们所有的答案: Math.Abs(a - b) 问题是当数字大时,这给出了错误的答案(通过溢出).更糟糕的是,如果(a - b) = Int32.MinValue然后Math.Abs崩溃而异常(因为Int32.MaxValue = Int32.MinValue - 1): System.OverFlowException发生 hresult = 0x80131516 消息= 否定二元补体编号的最小值是 无效. 来源= mscorlib Stacktrace:在 system.math.abshel​​per(int32值)在system.math.abs(int32 value) 其特定的性质导致难以生产的错误. 也许我缺少一些众所周知的库功能,但是有什么方法可以安全地确定差异? 解决
6 2024-04-14
编程技术问答社区
迫使PHP整数溢出
我们有一些整数算术,出于历史原因,必须在PHP上工作,与几种静态类型的语言相同.自从我们上次升级PHP以来,整数溢出的行为发生了变化.基本上我们正在使用以下公式: function f($x1, $x2, $x3, $x4) { return (($x1 + $x2) ^ $x3) + $x4; } 但是,即使进行转换: function f($x1, $x2, $x3, $x4) { return intval(intval(intval($x1 + $x2) ^ $x3) + $x4); } 我仍然以完全错误的数字…… 例如,$ x1 = -1580033017,$ x2 = -2072974554,$ x3 = -1170476976)和$ x4 = -1007518822,我最终以-30512150在PHP和1617621783 IN C c#. . 仅添加$ x1和$ x2,我无法得到正确的答案: 在c#我得到 (-1580
0 2024-04-10
编程技术问答社区
在C#中,int没有溢出异常?
我在项目euler 上我使用了一个int来进行总和,我的算法产生了答案,但是当我粘贴它以验证答案时,这是错误的. 事实证明,结果太大而无法适合INT,但这不会导致溢出错误或其他内容吗?相反,它只是返回了一个远离真实答案的值. 当我将类型更改为长时间时,一切都是笨拙的. 解决方案 c#整数操作默认情况下不会在溢出时抛出异常.您可以通过项目设置或进行计算checked: 来实现这一目标. int result = checked(largeInt + otherLargeInt); 现在操作将投掷. 相反的是unchecked,它使任何操作明确未经检查.显然,这只有在项目设置中启用了检查操作时才有意义. 其他解决方案 在C#an OverflowException IS不抛出(在VB中,例外是每个默认值抛出的). 要获得示例,您必须将代码嵌入checked上下文: byte value = 241; checked { try
2 2024-04-10
编程技术问答社区
哪些 "C "实现没有实现有符号整数的模数运算?
参考特别是,我正在寻找默认行为的实例,可能是由于基础机器架构. 这是一个代码示例和终端会话,说明了签名整数的模型算术行为: overflow.c: #include #include int main(int argc, char *argv[]) { int a, b; printf ( "INT_MAX = %d\n", INT_MAX ); if ( argc == 2 && sscanf(argv[1], "%d,%d", &a, &b) == 2 ) { int c = a + b; printf ( "%d + %d = %d\n", a, b, c ); } return 0; } 终端会话: $ ./overflow 2000000000,2000000000 INT_MAX = 2147483647 2000000000 +
6 2024-04-10
编程技术问答社区
c中的整数的包络
我已经在C中从C中进行编程.但是,从来没有使用过整数包裹的程序.我知道,如果整数分配了4个字节,那么整数范围将变为-2,147,483,648至2,147,483,647.如果我们超出了极限,它就可以缠绕. 我正在使用以下程序,以找出环绕周围的情况. #include int main() { int n = 4, s = 2; for (int i = 0; i
0 2024-04-09
编程技术问答社区
如果LONG_MAX是2147483647,strtol("-2147483648", 0, 0)是否溢出?
根据strtol的规范: 如果主题序列具有预期形式,并且基本的值为0,则以第一个数字开头的字符序列应解释为整数常数.如果主题序列具有预期形式,基数的值在2到36之间,则应将其用作转换的基础,并将其归因于上述给出的每个字母.如果主题序列始于负符号,则应否定转换产生的值.指向最终字符串的指针应存储在EndPtr指向的对象中,只要EndPtr不是零指针. 当前的问题是,在否定之前,该值不在long范围内.例如,在由于使用"整数常数"的措辞可以解释以将C规则应用于整数常数的类型,因此这可能足以使我们免于在此处避免不确定的行为,但是同样的问题(没有那么简单的问题)将适用于strtoll. 最后,请注意,即使它确实溢出,也应返回"右"值.因此,这个问题实际上是关于在这种情况下是否必须设置的errno. 解决方案 基于标准中的实际语言仍然是模糊的: 如果主题序列具有预期形式,并且基本的值为零,则根据第一个数字开头的字符序列根据6.4.4.1的规则解释为整数常数.如果主题
2 2024-04-08
编程技术问答社区
当a和b都小于c时,我如何计算a * b / c,但a * b会溢出?
假设uint是我的定点平台上最大的积分类型,我有: uint func(uint a, uint b, uint c); 需要返回a * b / c的良好近似值. c的值大于a的值和b的值. 的值 因此,我们确定a * b / c的值适合uint. 但是,a * b本身的值溢出了uint的大小. 因此,计算a * b / c值的一种方法是: return a / c * b; 甚至: if (a > b) return a / c * b; return b / c * a; 然而,c的值大于a的值和b的值. 的值 因此,上面的建议只会返回零. 我需要按比例减少a * b和c,但再次 - 问题是a * b溢出. 理想情况下,我可以: 用uint(-1) a * b 替换 替换c uint(-1) / a / b * c. 但是,无论我如何订购表达式uint(-1) / a / b * c,我都会遇到
4 2024-04-08
编程技术问答社区
重复的互换。避免溢出
背景: 给定的n球,因此: 'a' balls are of colour GREEN 'b' balls are of colour BLUE 'c' balls are of colour RED ... (当然a + b + c + ... = n) 可以安排这些球的排列数量: 给出: perm = n! / (a! b! c! ..) 问题1: 我如何"优雅地"计算perm,以免尽可能长时间 ,并确保完成计算后,我要么具有perm的正确值,或者我知道最终结果会溢出吗? 基本上,我想避免使用GNU GMP之类的东西. 可选,问题2: 这是一个真的不好的主意,我应该继续使用GMP吗? 解决方案 如果您有CPU时间的地球,则可以从所有阶乘中列出列表,然后找到列表中所有数字的质量分解,然后取消顶部的所有数字,而底部的所有数字都在底部,直到数字完全减少为止. 其他解决方案 这些被称为多项式系数,我将用m(a,b,...). 表
2 2024-04-08
编程技术问答社区
Quicksort例子中的错误(K&R C书)?
此QuickSort应该将" V [左] ... V [右]分类为增加的顺序"; K&R(第二版)从C编程语言中复制(无评论): void qsort(int v[], int left, int right) { int i, last; void swap(int v[], int i, int j); if (left >= right) return; swap(v, left, (left + right) / 2); last = left; for (i = left+1; i
2 2024-04-08
编程技术问答社区
为什么在以下程序中可能出现溢出?
void main () { int i; if (i 0) { i = -i; } // No overflow here 其他解决方案 您在堆栈中的" I"值时,当Main启动时是不确定的.称为Main()之前运行的启动代码可以留在那里. Addig at kashif 说,负整数可以转到一个低于非式整数的值由于负面因素不需要留出零的空间.符
2 2024-04-08
编程技术问答社区
INT_MIN的绝对值
如何在不溢出的情况下提取INT_MIN的绝对值?请参阅此代码的问题: #include #include #include int main(void) { printf("INT_MAX: %d\n", INT_MAX); printf("INT_MIN: %d\n", INT_MIN); printf("abs(INT_MIN): %d\n", abs(INT_MIN)); return 0; } 吐出以下 INT_MAX: 2147483647 INT_MIN: -2147483648 abs(INT_MIN): -2147483648 我需要一个检查int值是否大于零. 至于这个问题是为什么最大负整数的绝对值-2147483648仍然是-2147483648?,我必须不同意,因为这是为什么,不是一个问题. 解决方案 %d格式字符串中的%d转换说明符
0 2024-04-08
编程技术问答社区
找到两个数值的平均数的正确方法是什么?
我最近了解到整数溢出是C中的一个不确定的行为(附带问题 - 它也是C ++中的UB吗?) 通常在C编程中,您需要找到两个值的平均值a和b.但是,这样做(a+b)/2可能会导致溢出和未定义的行为. 所以我的问题是 - 在C? 中找到两个值的平均值的正确方法是什么 解决方案 在安全编码 if (((si_b > 0) && (si_a > (INT_MAX - si_b))) || ((si_b
2 2024-04-07
编程技术问答社区
如果C编译器无法证明缺乏UB,为什么禁止优化?
如果C程序的行为不确定,则可能发生任何事情.因此,编译器可以假定任何给定程序都不包含UB.因此,假设我们的程序包含以下内容: x += 5; /* Do something else without x in the meantime. */ x += 7; 当然,可以将其优化为 /* Do something without x. */ x += 12; 或类似的另一种方式. 如果x具有类型unsigned int,则上述程序中没有UB的可能性.另一方面,如果x具有signed int类型,则有可能溢出,因此有UB.由于编译器可以假定我们的程序不包含UB,因此我们可以在上面进行相同的优化.实际上,在这种情况下,编译器甚至可以假定x - 12
整数溢出是否会因为内存损坏而导致未定义行为?
我最近阅读了C和C ++中签名的整数溢出会导致不确定的行为: 如果在评估表达式期间,该结果在数学上没有定义或不在其类型的代表值范围内,则行为是未定义的. 我目前正在尝试了解这里不确定行为的原因.我认为不确定的行为是在这里发生的,因为整数在太大而无法适合基础类型时开始操纵周围的内存. 所以我决定在Visual Studio 2015中编写一个小测试程序,以以下代码测试该理论: #include #include struct TestStruct { char pad1[50]; int testVal; char pad2[50]; }; int main() { TestStruct test; memset(&test, 0, sizeof(test)); for (test.testVal = 0; ; test.testVal++) {
0 2024-04-07
编程技术问答社区