Tag: 64位

C ++中的大文件支持

每个平台上的64位文件API都不同。 在windows中: _fseeki64 在linux中: fseeko 在freebsd:另一个类似的电话…… 我怎样才能最有效地使它更方便和便携? 有什么有用的例子吗?

#ifdef用于32位平台

在我维护的应用程序中,我们遇到了影响stdlib的文件描述符限制的问题。 此问题仅影响标准库的32位版本。 我已经为我的代码设计了一个修复程序,并希望实现它,但只有在编译32位可执行文件时才能实现。 我可以#ifdef使用什么预处理器符号来确定是为32位还是64位目标编译代码? 编辑 对不起,没提,代码是跨平台,linux,windows,solaris和其他一些unix风格,大多使用GCC进行编译。 我可以跨平台使用任何事实上的标准吗? 编辑2 我发现了一些似乎可能有用的定义“__ILP23”和“__LP64”… 这里的讨论解释了unix平台的背景。 任何人都有使用这些定义的经验吗? 这有用吗?

如何在命令行中使用Visual Studio编译x64代码?

我想使用Windows命令行编译一个简单的hello-world风格的程序。 cl file_name.c 很容易。 现在我想在64位中做同样的事情。 我该怎么办?

从i386移动到x86_64时的浮点精度

我有一个为Linux x86 32位开发的应用程序。 根据结果​​,有许多浮点运算和大量测试。 现在我们将它移植到x86_64,但测试结果在这个架构中是不同的。 我们不希望为每个体系结构保留一组单独的结果。 根据GCC简介 – 对于GNU编译器gcc和g ++ ,问题是X86_64中的GCC假设fpmath = sse而x86假定fpmath = 387 。 387 FPU对所有操作使用80位内部精度 ,仅将结果转换为给定的浮点类型(float,double或long double),而SSE使用操作数的类型来确定其内部精度。 在编译我自己的代码并且我的所有操作都正常工作时,我可以强制-mfpmath = 387 ,但每当我调用一些库函数(sin,cos,atan2等)时,结果再次出错。 我认为这是因为libm是在没有fpmath覆盖的情况下编译的。 我尝试使用387仿真自己构建libm(glibc),但它导致了很多崩溃(不知道我做错了什么)。 有没有办法强制进程中的所有代码在x86_64中使用387仿真? 或者也许某些库在两种体系结构上都返回与libm相同的值? 有什么建议? 关于“你需要80位精度”的问题,我不得不说这不是个别操作的问题。 在这个简单的情况下,差异非常小,没有区别。 但是,当复合很多操作时,错误会传播,并且最终结果的差异不再那么小,并且会产生影响。 所以我想我需要80位精度。

在C中计算64×64 int产品的高64位

我希望我的C函数能够有效地计算两个64位有符号整数的乘积的高64位。 我知道如何在x86-64程序集中执行此操作,使用imulq并从%rdx中提取结果。 但是我完全不知道如何在C语言中编写它,更不用说让编译器有效地执行它了。 有没有人有任何建议用C写这个? 这是性能敏感的,所以“手动方法”(如俄罗斯农民或bignum图书馆)已经出局。 我写的这个笨拙的内联汇编函数很有用,大致是我追求的代码: static long mull_hi(long inp1, long inp2) { long output = -1; __asm__(“movq %[inp1], %%rax;” “imulq %[inp2];” “movq %%rdx, %[output];” : [output] “=r” (output) : [inp1] “r” (inp1), [inp2] “r” (inp2) :”%rax”, “%rdx”); return output; }

64位浮点移植问题

我正在将我的应用程序从32位移植到64位。 目前,代码在两种架构下编译,但结果不同。 由于各种原因,我使用浮动而不是双打。 我假设在一台机器上有一些从浮动到双重的隐式上转换而不是另一台机器。 有没有办法控制这个,或者我应该寻找的具体问题? 编辑添加: 32位平台 gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-33) Dual-Core AMD Opteron(tm) Processor 2218 HE 64位平台 gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3 Intel(R) Xeon(R) CPU 应用-mfpmath = 387有点帮助,在算法的1次迭代之后,值是相同的,但除此之外,它们再次失去同步。 我还要补充一点,我的担心并不是结果不一样,而是移植到64位平台已经发现了32位依赖关系,我不知道。

如何在C中使用asm添加两个64位数时访问进位标志

是的,谢谢你的工作。 @PeterCordes。 __int128有效。 但是还有一件事,正如你所说的使用多精度算法的内在函数,即C中的_addcarry_u64 ,使用头文件immintrin.h我有以下代码 #include #include #include #include unsigned char _addcarry_u64(unsigned char c_in, uint64_t src1, uint64_t src2,uint64_t *sum); int main() { unsigned char carry; uint64_t sum; long long int c1=0,c2=0; uint64_t a=0x0234BDFA12CD4379,b=0xA8DB4567ACE92B38; carry = _addcarry_u64(0,a,b,&sum); printf(“sum is %lx and carry value is %un”,sum,carry); return 0; } 你能指出我的错误吗? 我正在获得对_addcarry_u64未定义引用。 一些快速谷歌没有回答问题,如果要使用任何其他头文件或它与gcc不兼容,为什么这样 最初我有这个代码用于添加两个64位数字: static __inline int is_digit_lessthan_ct(digit_t […]

C和C ++中float和double的大小是多少?

我正在寻找是否有任何类似于uint32_t标准类型,它总是会映射到32位无符号整数类型但我找不到任何类型。 float的大小在所有平台上总是4个字节吗? double大小总是8? 这两个标准是否有任何关于此事的说法? 我想确保我的大小在所有平台(x86和x64)上总是相同的,所以我使用的是标准的int类型,但是我找不到任何类似的float和double typedef。

2D morton代码编码/解码64位

如何将[x,y]的morton代码(z-order)编码/解码为32位无符号整数,产生64位morton代码,反之亦然? 我确实有xy2d和d2xy,但仅适用于16位宽的坐标,产生32位莫顿数。 在网上搜索了很多,但找不到。 请帮忙。

什么决定整数的大小?

sizeof(int)在我的Dev Cpp上显示4,即使它在64位机器上运行。 为什么不考虑底层硬件并显示8呢? 另外,如果我编译环境也改为64位( 64 bit compiler首先有意义吗?!),那么int的大小会改变吗? 是否有任何标准来决定这一点?