我知道该解决方案很丑陋并且在技术上不正确,但我不明白为什么代码不起作用。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main (int argc, char *argv[]) {
int u;
scanf("%d", &u);
printf("absValue = %u\n", u);
return 0;
}
%u 指定一个无符号十进制字符,但是当我输入负值时,它给出
absValue = 4294967293
或者,使用if命令,如何将负号转换为正号?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main (int argc, char *argv[]) {
int n;
scanf("%d", &n);
if(n < 0) {
printf("absValue = -%d\n", n);
} else {
printf("absValue = %d\n", n);
}
return 0;
}
第一段代码中最短的解决方案是更改printf
声明如下:
printf("absValue = %u\n", (unsigned)((u<0)?-u:u));
这将打印绝对值u
。类型转换(unsigned)
确保数据类型符合预期printf
。该声明(u<0)?-u:u
使用条件运算符选择值-u
如果条件(u<0
) 为真且u
如果条件为假(即u>=0
).
你的代码中的问题是u
是一个有符号整数,这意味着它的值是使用二进制补码表示法4 个字节(*) 和printf
不聪明。当你告诉printf
显示无符号整数,然后printf
将占用 4 个字节u
并将它们解释为无符号整数。由于二进制补码中的负数存储为大正整数,这就是您看到的结果。
(*) 二进制补码的使用和int
4 的大小取决于机器,但很常见。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)