在PIC上使用long long时的四舍五入问题
我正在对PIC微控制器,在C中运行代码以及使用MPLABX和XC16编译器进行一些简单的数学.这是代码: double mydouble = 0.019440; long long int mypower = 281474976710656; long long int result = mypower*mydouble; 打印出"结果"给我5,471,873,794,048;虽然应该提供5,471,873,547,255.知道什么是导致这个问题的原因,以及我如何纠正它? 谢谢 解决方案 XC16默认情况下将双重和浮点处理为32位数据类型.您需要给出汇编选项-fno-short-double以使用64位双打. 您也可以将long double用作数据类型,但是目前我无法编译来验证. (作为测试,5,471,873,794,048也是您使用float而不是double在X86上编译样本代码的结果,而不是double)
8 2024-04-07
编程技术问答社区
对于可移植代码,我应该使用long long还是int64_t?
我有一个用C和C ++编写的开源代码库.我正在寻找一种整数类型,保证至少 64位宽,可以在大多数OS X(Intel,64位)和带有开源C的Linux Box上可靠地编译.和C ++编译器,最终用户没有太多额外的工作. Windows和32位客户端支持目前并不重要. 我在OS X上进行了一些测试,并且使用开发人员工具运输的最新GCC不支持C+11模式(因此似乎不能保证long long的可用性). clang也不支持这一点,尽管在某个版本之后启用了C99模式,但它支持long long. 当可移植性是一个重要目标时,是否建议使用int64_t代替long long?使用格式说明符似乎很痛苦. 我可以可靠地将int64_t施加到long long(以及同样在uint64_t上等效的unsigned)与以long long为参数的现有函数和库一起使用它吗? (当然,再次返回.) 在那个心理框架中,如果我运送不需要叮当功能的代码,而不是在GCC中,Clang将替换GCC
10 2024-04-06
编程技术问答社区
为什么C语言编译器指定long为32位,long为64位?
做长64位并保留长时间直到128位数字成为现实的长时间才更有意义吗? 解决方案 是的,确实有意义,但是微软有自己的理由将"长"定义为32位. 据我所知,在目前所有主流系统中,Windows是唯一的" Long"为32位的操作系统.在Unix和Linux上,是64位. Windows的所有编译器都将在Windows上编译为"长"到32位,以保持与Microsoft的兼容性. 因此,我避免使用" int"和" long".有时,我将使用" int"进行错误代码和布尔值(在C中),但是我从不将它们用于任何取决于类型大小的代码. 其他解决方案 C标准尚未指定原始数据类型的比特长度,而仅指定其中的最小长度.因此,编译器可以在原始数据类型的位长度上具有选项.在确定每种原始数据类型的比特长度时,编译器设计人员应考虑几个因素,包括计算机体系结构. 这是一些参考: 其他解决方案 对于历史记录,包括为什么Unix系统通常会在LP64上融合,以及为什么Windows没有
6 2024-04-06
编程技术问答社区
32位机器上如何存在长时间的long int?
我读到GCC支持long long int类型,该类型至少需要64位.但是,如何在只有32位宽的CPU上使用它进行数学操作? 解决方案 编译器将合成使用多个CPU指令执行操作的数学操作(或使用功能调用).例如,添加操作将添加long long>值的低阶组件(低词),然后将其置于该操作中,并将其输入long long的高阶单词上的添加操作中. 所以以下C代码: long long a; long long b; long long c; // ... c = a + b; 可能由显示的指令序列表示: mov eax, [a.low] ; add the low order words add eax, [b.low] mov edx, [a.high] ; add the high order words, adc edx, [b.high] ; including the carry mov [c.low], eax mov [c.high
6 2024-04-06
编程技术问答社区
"long long "是什么样的数据类型?
我不知道这种类型.那是最大的吗?我认为这是一种整数类型,对吗?还是浮点的东西?大于双人? 解决方案 根据 c99 标准,long long是一种整数类型至少64位宽.指定了两种整数64位类型:long long int和unsigned long long int 所以,是的,这是C语言标准指定的最大整数类型(C99版本). 还有长double double C99指定的类型.这是在最流行的基于X86的平台上的80位和C语言实现的80位的扩展精度浮点数数据类型. . 其他解决方案 简单简单的是,long long是int,至少64位.这样做的基本原理是
4 2024-04-06
编程技术问答社区
无符号_int64的sprintf
我有以下代码. Sprintf中第二%D的输出始终显示为零.我认为我指定错误的指定符.任何人都可以帮助我以正确的值写字符串.这必须在POSIX标准中实现.感谢您的输入 void main() { unsigned _int64 dbFileSize = 99; unsigned _int64 fileSize = 100; char buf[128]; memset(buf, 0x00, 128); sprintf(buf, "\nOD DB File Size = %d bytes \t XML file size = %d bytes", fileSize, dbFileSize); printf("The string is %s ", buf); } 输出: The string is OD DB File Size = 100 bytes XML file size = 0 bytes 解决
10 2024-04-06
编程技术问答社区
如何用printf格式化一个无符号的长形int?
#include int main() { unsigned long long int num = 285212672; //FYI: fits in 29 bits int normalInt = 5; printf("My number is %d bytes wide and its value is %ul. A normal number is %d.\n", sizeof(num), num, normalInt); return 0; } 输出: My number is 8 bytes wide and its value is 285212672l. A normal number is 0. 我认为这个意外的结果是通过打印unsigned long long int.您如何printf() unsigned long long int? 解决方案 将LL(EL-EL)与u(无符号)转换的ll(
6 2024-04-05
编程技术问答社区
在C语言中,大数模数的功率为m
我正在使用以下函数来计算大数量的幂,其中m是任何整数,即. (a^b)%m long long power(long long x, long long y, long long p) { long long res = 1; // Initialize result x = x % p; // Update x if it is more than or // equal to p while (y > 0) { // If y is odd, multiply x with result if (y & 1) res = (res*x) % p; // y must be even now y = y>>1; // y = y/2 x = (x*x) % p; } return
8 2024-01-23
编程技术问答社区
在C语言中把字符串转换为长长的麻烦事
我很难获取Atoll功能,以正确设置C中的长长值.这是我的示例: #include int main(void) { char s[30] = { "115" }; long long t = atoll(s); printf("Value is: %lld\n", t); return 0; } 此打印: 值是:0 这有效: printf("Value is: %lld\n", atoll(s)); 这里发生了什么? 解决方案 首先,让我们回答您的问题: #include #include // THIS IS WHAT YOU ARE MISSING int main(void) { char s[30] = { "115" }; long long t = atoll(s); printf("Value is:
34 2023-10-01
编程技术问答社区
long long与int的乘法
给定以下片段: #include typedef signed long long int64; typedef signed int int32; typedef signed char int8; int main() { printf("%i\n", sizeof(int8)); printf("%i\n", sizeof(int32)); printf("%i\n", sizeof(int64)); int8 a = 100; int8 b = 100; int32 c = a * b; printf("%i\n", c); int32 d = 1000000000; int32 e = 1000000000; int64 f = d * e; printf("%I64d\n", f); } MingW GCC 3.4.5的输出IS(-O0): 1
54 2023-04-05
编程技术问答社区
3 * 1000000000作为一个int溢出,但该变量是long long。为什么?
我有一个简单的C ++应用程序,可以执行以下计算 long long calcOne = 3 * 100000000; // 3e8, essentially long long calcTwo = 3 * 1000000000; // 3e9, essentially long long calcThree = 3 * 10000000000; // 3e10, essentially 如果我写每个计算的结果,我将获得以下输出: calcOne = 300000000 calcTwo = -1294967296 calcThree = 30000000000 那么,为什么第二个计算失败了?据我所知,它在长期的范围内(计算更大...). 我在Windows 10上使用Visual Studio 2015. 解决方案 整数常数为,默认情况下ints. 1000000000 可以适合int.因此,该常数被解析为int.但是将其乘以3个溢出
38 2023-03-11
编程技术问答社区
-9'223'372'036'854'775'808LL is unsigned
由于C ++ 20两的补体表示形式是标准允许的唯一表示,其保证范围从-2 n-1 到+2 n-1 -1.因此,对于64位签名的整数类型,范围从-9'223'372'036'854'775'808到9'223'372'036'854'775'807.但是,此代码不会在Visual Studio上进行编译(也不是在GCC上) int main() { long long x{-9'223'372'036'854'775'808LL}; // error C4146: unary minus operator applied to unsigned type, result still unsigned // error C2397: conversion from 'unsigned __int64' to '__int64' requires a narrowing conversion } 然而,如果我用long long x{-9'223'372'03
8 2023-03-11
编程技术问答社区
C++11'的long long真的至少是64位吗?
它说 wikipedia on wikipedia 和 该类型long long至少与int> int,并且具有 no少于64位.我一直在研究C ++ 11标准§3.9.1基本类型部分,但找不到对64位的任何参考.我只能找到它至少在long int上的时间至少与int一样长.标准列表long long作为A 标准整数类型,而不是扩展一真的.如果是,它在哪里说? 请注意,我说的是C ++ 11标准long long. 解决方案 C ++标准参考为此的C标准,请参见[C.limits]. LLONG_MAX在中定义,其含义与c's 的LLONG_MAX相同.这就是C所说的: 5.2.4.2.1整数类型的尺寸 下面给出的值应替换为适合在#if预处理指令中使用的常数表达式. [...]他们的实现定义值的幅度应等于或更大(绝对值),并具有相同的符号. [...] - 类型long long int 对象的
48 2023-03-02
编程技术问答社区
截断的整数除法去除
t如何避免此代码中的整数截断?我的排序阵列是1 1 1 1 1 1,因此A [0] = 1,A [n]应为1/2 = 0.5. int main() { long long n,w; scanf("%lld %lld", &n, &w); long long arr[2*n]; for(long long i = 0; i
34 2023-03-02
编程技术问答社区
我如何检查A+B是否超过长长?(A和B都是长长的)
我有两个数字:A和B.我需要在代码中的某个地方计算A+B. A和B均为long long,它们可以是正面或负面. 我的代码运行错误,我怀疑当计算A+B时发生问题.我只想检查A+B超过long long范围.因此,任何方法都是可以接受的,因为我仅将其用于调试. 解决方案 仅当两个数字都具有相同的符号时,才有可能溢出.如果两者都是阳性的,则如果在数学上A + B > LLONG_MAX或等效地B > LLONG_MAX - A,则会溢出.由于右侧是非负的,因此后一种条件已经暗示B > 0.类似的论点表明,对于负面案例,我们也不需要检查B的迹象(感谢 ben voigt 指出B上的符号检查是不必要的).那么您可以检查 if (A > 0) { return B > (LLONG_MAX - A); } if (A
54 2023-02-24
编程技术问答社区
如何打印一个无符号长长的int(无符号长长的int的格式指定符)?
#include int main() { unsigned long long int num = 285212672; //FYI: fits in 29 bits int normalInt = 5; printf("My number is %d bytes wide and its value is %ul. A normal number is %d.\n", sizeof(num), num, normalInt); return 0; } 输出: My number is 8 bytes wide and its value is 285212672l. A normal number is 0. 我认为这个意想不到的结果来自打印 unsigned long long int.你如何printf() 和unsigned long long int? 解决方案 使用 ll (el-el) long-lon
19400 2022-07-19
编程技术问答社区