Tag: 64位

如何在32位计算机上与VS 2005交叉编译64位DLL?

使用Visual Studio 2005,我在C中编写了一个简单的DLL,它使用Windows API发送UDP数据报,并将其连接到第三方程序。 在64位计算机上,它根本不起作用,因为在这种情况下第三方代码编译为64位。 所以我需要发送同一个DLL的两个版本 – 一个用于32位,一个用于64位。 但是,我没有设法让Visual Studio(在32位机器上运行)吐出一个与32位版本不同的DLL – 似乎只是忽略了项目属性中的“机器”设置。 一位同事告诉我,VS 2008在这种情况下只是拒绝交叉编译。 这根本不可能吗?

va_arg 64位问题

我有这样的C代码。 在64位Linux系统上,结果是:4294967264而不是-32。 clang和gcc都生成具有相同错误结果的二进制文件。 行中的问题: * v = va_arg(args,long); #include #include #include void setter(long *v, …) { va_list args; va_start(args, v); *v = va_arg(args, long); va_end(args); } int main() { long v = 0; setter((long *) &v, -32); printf(“%ld\n”, v); return 0; }

64位除法

任何人都可以给我发送交流代码来划分2个64位数字。 我的编译器只支持32/32分区。 Thanx&Regards 玛尼

C中x64的128位算术运算

在x86上实现bignums时,显然数字大小的最有效选择是32位。 但是,您需要算术最多两倍的数字大小(即32 + 32 = 33,32 * 32 = 64,64 / 32 = 32)。 幸运的是,x86不仅提供了这一function,而且还可以从便携式C(uint64_t)访问它。 类似地,在x64上,希望使用64位数字。 这将需要128位算术(即64 + 64 = 65,64 * 64 = 128,128 / 64 = 64)。 幸运的是,x64提供了这个function。 不幸的是,它无法通过便携式C接入,但显然有人可以进入组装。 所以我的问题是它是否可从非便携式C访问.X64上的任何C编译器是否提供对此的访问,如果是,那么语法是什么? (注意,我不是在谈论128位向量,它们被严格地视为32或64位字的集合,它们之间没有进位传播,但是关于实际的128位整数运算。)

制作一个64位共享库,动态链接到Mac OS X Snow Leopard上的32位库

更新:经过一些阅读后,我发现这个问题非常普遍,你不能在同一个过程中混合架构,所以64位Java不能dlopen()像FMOD这样的32位库。 有没有可能的解决方法,请记住我正在编写自己的COD接口到FMOD库? 我需要在Max OS X上创建64位dylib,因为Java Native Access只喜欢64位计算机上的64位库。 问题是,我的C源代码动态地包含FMOD,在Mac上只提供32位dylib。 当我尝试编译时没有-m32选项(因为我必须输出64位dylib)我得到以下错误: gcc -dynamiclib -std=c99 -pedantic -Wall -O3 -fPIC -pthread -o ../bin/libpenntotalrecall_fmod.dylib ../../src/libpenntotalrecall_fmod.c -lfmodex -L../../lib/osx/ ld: warning: in /usr/lib/libfmodex.dylib, missing required architecture x86_64 in file Undefined symbols: “_FMOD_System_CreateSound”, referenced from: _startPlayback in ccJnlwrd.o “_FMOD_Channel_GetPosition”, referenced from: _streamPosition in ccJnlwrd.o “_FMOD_System_Create”, referenced from: _startPlayback in ccJnlwrd.o “_FMOD_System_PlaySound”, referenced from: […]

make plain int 64 bit会破坏很多合理的代码吗?

直到最近,我还是考虑过大多数系统实现者/供应商的决定,即使在64位机器上也能保持32位,这是一种权宜之计。 对于现代C99固定大小类型( int32_t和uint32_t等),需要有一个标准整数类型,每个大小8,16,32和64大多消失,似乎int也可以做64位。 但是,C中plain int大小的最大实际结果来自于C本质上没有小于int类型的算术。 特别是,如果int大于32位,则对uint32_t值的任何算术的结果都具有signed int类型,这相当令人不安。 这是否是在实际实现int永久固定为32位的一个很好的理由? 我倾向于说是的。 在我看来,当int大于32位时, uint32_t可能会有大量使用。 除非你回到uint32_t否则即使应用一元减号或按位补码运算符也会变得危险。 当然,同样的问题适用于当前实现的uint16_t和uint8_t ,但是每个人似乎都知道并习惯将它们视为“小于int ”类型。

c库x86 / x64汇编程序

是否有用于将x86 / x64汇编字符串组装到操作码的C库? 示例代码: /* size_t assemble(char *string, int asm_flavor, char *out, size_t max_size); */ unsigned char bytes[32]; size_t size = assemble(“xor eax, eax\n” “inc eax\n” “ret”, asm_x64, &bytes, 32); for(int i = 0; i < size; i++) { printf("%02x ", bytes[i]); } /* Output: 31 C0 40 C3 */ 我看过asmpure ,但它需要修改才能在非Windows机器上运行。 我实际上都需要一个汇编器和一个反汇编器,是否有一个提供两者的库?

在GNU / Linux中表示64位整数

我正在使用带有gcc Ubuntu 10.10(64位),我想在我的C ++程序中使用64位整数。 在我的系统上, sizeof(long) , sizeof(long long int)和sizeof(int64_t)的输出都是8字节(64位)。 您建议使用64位整数的哪个限定符( long , long long或int64_t )?

unsigned short和签名的短期比较奇怪的行为

当我为signed和unsigned short指定相同的值并进行比较时,它会失败,但它适用于int 。 除非我使用其中一个或另一个使它们成为相同的类型,否则比较不起作用。 #include int main() { signed short b = -10; unsigned short c=-10; signed int a = -10; unsigned int d=-10; printf(“%d , %d\n”,b,(unsigned short)b); printf(“%d , %d\n”,(signed short)c,c); printf(“%d , %u\n”,a,(unsigned int)a); printf(“%d , %u\n”,(signed int )d,d); printf(“b==c %d\n”, b==c); printf(“a==d %d\n”, a==d); return 0; } 输出: ./a.out -10 , 65526 […]

C 64位指针对齐

64位系统上的指针是否仍然是4字节对齐(类似于32位系统上的双精度)? 或者他们注意到8字节对齐? 例如,在64位系统上,以下数据结构有多大: struct a { void* ptr; char myChar; } 指针是否会被8字节对齐,导致7个字节的填充(字符总数= 8 + 8 = 16)? 或者指针是4字节对齐(4字节+4字节)导致3字节的填充(总= 4 + 4 + 4 = 12)? 谢谢,瑞恩