我试图想出一个方法,它接受一个整数并返回一个布尔值来说明数字是否为素数,我不知道多少C; 有人会关心给我一些指示吗?
基本上,我会在C#中这样做:
static bool IsPrime(int number)
{
for (int i = 2; i < number; i++)
{
if (number % i == 0 && i != number)
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud) 通过在有符号整数上使用无符号整数,是否有任何性能增益/损失?
如果是这样,这也是短期和长期的吗?
我正在使用下面的简单交换排序算法在Windows中的Visual Studio项目中尝试不同的整数类型.处理器是英特尔.代码是在Release x64中编译的.优化设置为"最大化速度(/ O2)".与编译设置对应的命令行是
/permissive- /GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"x64\Release\vc141.pdb" /Zc:inline /fp:precise /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Fp"x64\Release\SpeedTestForIntegerTypes.pch" /diagnostics:classic
Run Code Online (Sandbox Code Playgroud)
代码本身:
#include <ctime>
#include <vector>
#include <iostream>
void sort(int N, int A[], int WorkArray[]) // exchange sort
{
int i, j, index, val_min;
for (j = 0; j < N; j++)
{
val_min = 500000;
for (i = j; i < N; i++) …Run Code Online (Sandbox Code Playgroud) 我有一个遗留的代码库,我们正试图从中迁移devtoolset-4到devtoolset-7.我注意到有关有符号整数溢出的有趣行为(int64_t具体而言).
有一个代码片段,用于检测整数溢出,同时乘以一大组整数:
// a and b are int64_t
int64_t product = a * b;
if (b != 0 && product / b != a) {
// Overflow
}
Run Code Online (Sandbox Code Playgroud)
这段代码与devtoolset-4一起工作正常.但是,使用devtoolset-7时,永远不会检测到溢出.
例如:当a = 83802282034166和b = 98765432,
product变为-5819501405344925872(显然值已溢出).
但product / b结果价值等于a (83802282034166).因此,if情况永远不会成真.它的值应该根据overflown(负)product值计算:-5819501405344925872 / 98765432 = -58922451788
具有讽刺意味的是,数学是正确的,但它导致devtoolset-4的异常行为.
product / b != a
为product != a * b并达到相同的溢出值(或者可能只是根据上面的语句跳过计算 …可能的重复:
无符号与有符号整数的性能
我读的地方,它是一点点更快的x86_64比较signed ints中C/C++相比unsigned ints,如for (int i...)是“快”比for (uint i...)。
真的吗?为什么这是真的?我知道差异非常小,但无论如何。