Tag: 32位

在32位系统上使用libevent提供大文件(> 2GB)

序言:基于libevent v2(evhttp),Linux,ARM,glibc2.3.4用C编写的轻量级http服务器 我正在尝试使用32位系统上的evbuffer_add_file()来提供大文件(超过2GB)。 libevent是用-D_FILE_OFFSET_BITS = 64标志编译的。 这是简化的代码: int fd = -1; if ((fd = open(path, O_RDONLY)) < 0) { // error handling } struct stat st; if (fstat(fd, &st) < 0) { // error handling } struct evbuffer *buffer = evbuffer_new(); evbuffer_set_flags(buffer, EVBUFFER_FLAG_DRAINS_TO_FD); // force using system's sendfile evbuffer_add_file(buffer, fd, 0, st.st_size); evhttp_send_reply(req, 200, NULL, […]

如何在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在这种情况下只是拒绝交叉编译。 这根本不可能吗?

是否可以在32位处理器的机器中运行64位代码?

我已经四处寻找这些问题的答案。 但运气不大。 是否可以在具有64-bit processor的计算机中运行32-bit代码? 答案似乎是肯定的。 但是在性能问题上存在争议,因为处理器上没有使用32-bits 。 现在我的问题反之亦然,是否可以在具有32-bit处理器的机器中运行64-bit代码? 从我的小理解,答案是否定的,因为设计为64-bit运行的代码将使用64-process registars但32-bit机器只提供32。 另一方面,我找到了这个链接 。 据此,可以在32位机器上编译64位代码。 但我不知道如何做到这一点加上如果在32-bit机器上进行编译也能保证在同一台机器上execution 。 谢谢你的帮助

readdir()32/64兼容性问题

我正试图让一些旧的遗留代码在新的64位系统上运行,而且我现在卡住了。 下面是一个小C文件,我用它来测试当前正在破坏的实际程序中存在的function。 #define _POSIX_SOURCE #include #include #undef _POSIX_SOURCE #include main(){ DIR *dirp; struct dirent *dp; char *const_dir; const_dir = “/any/path/goes/here”; if(!(dirp = opendir(const_dir))) perror(“opendir() error”); else{ puts(“contents of path:”); while(dp = readdir(dirp)) printf(” %s\n”, dp->d_name); closedir(dirp); } } 问题: 操作系统是Red Hat 7.0 Maipo x86_64。 遗留代码是32位,必须保持这种方式。 我已经使用带有g++的-m32标志使程序的编译工作正常。 出现的问题是在运行时, readdir()得到一个64位的inode,然后抛出一个EOVERFLOW错误,当然没有打印出来。 我尝试使用readdir64()代替readdir()取得一些成功。 我不再得到errno EOVERFLOW,并且终端上出现了线条,但文件本身并没有被打印出来。 我假设这是由于缓冲区不是什么直接期望。 我试图使用dirent64来尝试缓解这个问题,但每当我尝试这个时,我得到: test.c:19:22 error: […]

如何在C语言中检测包装计数器和大负值之间的差异

为我的愚蠢道歉,因为这是我在这个论坛上的第一篇文章。 我试图通过以下代码检测包装无符号32位计数器和大负跳转之间的区别,但编译器给出了错误: 错误:由于数据类型的范围有限,比较始终为真[-Werror = type-limits] 这是我的代码片段: #define MAX_BACKWARD_JUMP -4294959295 //UINT_MAX – 8000 #define MIN_BACKWARD_JUMP -3600 #define MAX_FORWARD_JUMP 4800000 signed int rtpDelta; //Signed 32-bit unsigned int currRTPTs, prevRTPTs; //unsigned 32-bit rtpDelta = currRTPTs – prevRTPTs; if ((rtpDelta > MAX_BACKWARD_JUMP && rtpDelta MAX_FORWARD_JUMP)) { printf(“Delta in Timestamps too large\n”,rtpDelta); } 这里的想法是在RTP时间戳中捕获无效的大型Deltas。 我们有一个当前的TimeStamp和一个从对等RTP客户端接收的前一个Timestamp。 RTP时间戳的无效值的边界限制是-4294959295 <rtpDelta <-3600,如果Delta小于-3600且大于-4294959295则应该抛出错误,因为更接近UMAX_INT的值将被视为翻转。 我在这做错了什么?

C 8位16位32位编译器之间的区别

这个问题可能是多余的,但我没有找到确切的答案。 C 8位16位32位编译器之间的区别是什么。 不同编译器为同一代码生成.exe的差异如何………..

为什么abs(0x80000000)== 0x80000000?

我刚刚开始阅读Hacker’s Delight ,它将abs(-2 31 )定义为-2 31 。 这是为什么? 我在几个不同的系统上尝试了printf(“%x”, abs(0x80000000)) ,并且我在所有系统上都返回了0x80000000。

帮我理解这个“编程珍珠”bitort程序

Jon Bentley在其编程珍珠的第1栏中介绍了一种使用位向量对非零正整数序列进行排序的技术。 我从这里获取了programort.c程序并粘贴在下面: /* Copyright (C) 1999 Lucent Technologies */ /* From ‘Programming Pearls’ by Jon Bentley */ /* bitsort.c — bitmap sort from Column 1 * Sort distinct integers in the range [0..N-1] */ #include #define BITSPERWORD 32 #define SHIFT 5 #define MASK 0x1F #define N 10000000 int a[1 + N/BITSPERWORD]; void set(int i) […]

最小化C中浮点错误的经验法则?

关于最小化浮点运算中的错误,如果我在C中执行如下操作: float a = 123.456; float b = 456.789; float r = 0.12345; a = a – (r * b); 如果我将乘法和减法步骤分开,计算结果是否会改变,即: float c = r * b; a = a – c; 我想知道CPU是否会以不同方式处理这些计算,从而在一种情况下误差可能会更小? 如果不是,我认为无论如何,是否有任何良好的经验法则来缓解浮点错误? 我可以按照有用的方式按摩数据吗? 请不要只说“使用更高的精度” – 这不是我所追求的。 编辑 有关数据的信息,在一般意义上,当操作导致非常大的数字(如123456789)时,错误似乎更糟。小数字(例如1.23456789)似乎在操作后产生更准确的结果。 我想象这个,还是扩大数字有助于准确?

Endian表示64位值

假设我unsigned long long x = 0x0123456789ABCDEF 。 以下哪项是正确的? (我只能validation第一个): 在32位小端处理器上,它将在内存中显示为67 45 23 01 EF CD AB 89 。 在64位小端处理器上,它将作为EF CD AB 89 67 45 23 01出现在内存中。 在32位大端处理器上,它将在内存中显示为01 23 45 67 89 AB CD EF 。 在64位大端处理器上,它将在内存中显示为01 23 45 67 89 AB CD EF 。