Tag: printf

printf双打的舍入行为

有人可以解释这种行为吗? 我很清楚浮点数的机器级表示。 这似乎与printf及其格式有关。 两个数字都用浮点表示法精确表示(检查:乘以64得到一个整数)。 #include #include using namespace std; int main() { double x1=108.765625; printf(“%34.30f\n”, x1); printf(“%9.5f\n”, x1); printf(“%34.30f\n”, x1*64); double x2=108.046875; printf(“%34.30lf\n”, x2); printf(“%9.5f\n”, x2); printf(“%34.30f\n”, x2*64); } 输出: > 108.765625000000000000000000000000 > 108.76562 > 6961.000000000000000000000000000000 > 108.046875000000000000000000000000 > 108.04688 > 6915.000000000000000000000000000000 请注意,第一个数字向下舍入,第二个数字向上舍入。

如何在C中对齐这样的数字?

我需要将C中的一系列数字与printf()对齐,如下例所示: ——-1 ——-5 ——50 —–100 —-1000 当然,所有这些之间都有数字,但它与手头的问题无关……哦,将破折号视为空格,我使用破折号,因此更容易理解我想要的东西。 我只能做到这一点: —-1— —-5— —-50– —-100- —-1000 或这个: —1 —5 –50 -100 1000 但这一切都不是我想要的,我只能使用printf()来实现第一个例子中显示的内容。 有可能吗? 编辑: 对不起的人,我匆忙,并没有很好地解释自己…我的最后一个例子和你的所有建议(使用像“%8d”这样的东西)不起作用,因为虽然最后一个数字是1000但它没有对于那件事,必须一直到1000甚至100或10。 无论要显示的位数,我最多只需要4个前导空格作为最大数字。 假设我必须显示从1到1000(A)和1到100(B)的数字,我使用“%4d”,这将是输出: A: —1 …. 1000 哪个是我想要的输出… B: —1 …. -100 这不是我想要的输出,我实际上想要这个: –1 … 100 但就像我说的,我不知道我必须打印的确切数字,它可以有1位数,它可以有2个,3个或更多,该函数应该为所有人准备。 我想要四个额外的前导空间,但那并不相关。 编辑2:似乎我想要的东西,我需要它的方式,这是不可能的(查看David Thornley和Blank Xavier的回答和我的评论)。 谢谢大家的时间。

如何将两个32位整数组合成一个64位整数?

我有一个计数寄存器,它由两个32位无符号整数组成,一个用于值的高32位(最高有效字),另一个用于值的低32位(最低有效字)。 在C中组合这两个32位无符号整数然后显示为大数的最佳方法是什么? 具体来说: leastSignificantWord = 4294967295; //2^32-1 printf(“Counter: %u%u”, mostSignificantWord,leastSignificantWord); 这打印很好。 当数字增加到4294967296时,我有它,所以最少有意思的W擦除为0,而且最重要的字(最初为0)现在为1.整个计数器现在应该读为4294967296,但是现在它只读取10,因为我只是连接1个来自最重要的词,0个来自最不重要的词。 我怎么能让它显示4294967296而不是10?

C动态printf double,不会丢失精度,也不会有尾随零

我是C的新手,从网上学习/上网。 我正在尝试编写一个函数,我可以传递任何double并返回一个int ,用于printf(“%.*lf” …语句,这样返回的int既不会降低精度也不会产生尾随零。 我有一个工作函数,但它很大,因为它是为了可读性而编写的,所有注释。 为了总结这个函数,我计算在10 > d >= 0的范围内得到double所需的除以10的除法,只取小数部分并将其放入一个带有n个小数位的string ,其中n = 15 – number_of_digits_left_of_decimal (我读到double类型只能跟踪15位数,从右到左检查string是否为尾随零并保持计数,最后返回一个int ,表示小数右边的非零数字。 有没有更简单的方法? 谢谢。 int get_number_of_digits_after_decimal(double d) { int i = 0; /* sometimes you need an int */ int pl = 0; /* precision left = 15 – sigfigs */ int sigfigs = 1; /* the number of digits […]

printf(“%d%d%d \ n”,++ a,a ++,a)输出

可能重复: 谁能解释这些未定义的行为(i = i ++ + ++ i,i = i ++等…) 我无法理解这个程序的输出(使用gcc )。 main() { int a=10; printf(“%d %d %d\n”,++a, a++,a); } 输出: 12 10 12 另外,请解释printf()参数的评估顺序。

printf以“%d”为数字,以0开头(前“0102”)给出意想不到的答案(ex’“66”)

我在printf语句中使用了下面的代码。 void main() { int n=0102; printf(“%d”, n); } 这打印66作为答案。 我还将变量n的值更改为012.它给出了答案10.请帮助我关于如何完成此转换?

sprintf(缓冲区,“%s ”,缓冲区,)是否安全?

我看到使用这种模式连接到我正在处理的一些代码中的字符串: sprintf(buffer, “%s \r\n”, buffer, id); sprintf(buffer, “%s”, buffer); 而且我很确定它不安全C.你会发现buffer既是输出又是第一个输入。 除了缓冲区溢出的明显可能性之外 ,我相信无法保证缓冲区在函数的开始和结束之间不会发生变化(即,无法保证缓冲区的状态在执行function)。 sprintf的签名还指定restrict目标字符串。 我还记得一篇关于memcpy中的推测性写作的报告,我认为没有理由为什么某个C库可能在sprintf中做同样的事情。 当然,在这种情况下,它会写入其来源。 这种行为安全吗? 仅供参考,我建议: char *bufEnd = buffer + strlen(buffer); /* sprintf returns the number of f’d and print’d into the s */ bufEnd += sprintf(bufEnd, ” \r\n”, id); 替换这个。

printf的意外输出

int a=5; float b=3.5; printf(“%d”,b); printf(“\n%f”,a); 任何人都可以告诉我为什么这段代码显示意外的输出(垃圾\ n3.5)

为什么这段代码打印两次?

可能重复: 在linux gcc中使用fork() #include void main () { printf (“ciao”); fork (); } 我有一些关于C优化的想法,但我不确定。 希望你知道答案。

printf指定float的整数格式字符串

#include int main() { float a = 5; printf(“%d”, a); return 0; } 这给出了输出: 0 为什么输出为零?