Mor*_*lde 9 c int integer-overflow
如何在INT_MIN
不溢出的情况下提取绝对值?请参阅此代码以了解该问题:
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf("INT_MAX: %d\n", INT_MAX);
printf("INT_MIN: %d\n", INT_MIN);
printf("abs(INT_MIN): %d\n", abs(INT_MIN));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
吐出以下内容
INT_MAX: 2147483647
INT_MIN: -2147483648
abs(INT_MIN): -2147483648
Run Code Online (Sandbox Code Playgroud)
我需要这个来检查一个int
值是否大于零.
至于这个问题是重复的为什么最大负整数-2147483648的绝对值仍然是-2147483648?,我不同意,因为这是一个如何,而不是一个为什么问题.
%d
格式字符串中的转换说明符将printf
相应的参数转换为带符号的十进制整数,在这种情况下,该int
类型会溢出。C 标准特别提到有符号整数溢出是未定义的行为。%u
您应该做的是在格式字符串中使用。此外,您还需要分别包含函数原型的标题stdio.h
和。stdlib.h
printf
abs
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
// This solves the issue of using the standard abs() function
unsigned int absu(int value) {
return (value < 0) ? -((unsigned int)value) : (unsigned int)value;
}
int main(void) {
printf("INT_MAX: %d\n", INT_MAX);
printf("INT_MIN: %d\n", INT_MIN);
printf("absu(INT_MIN): %u\n", absu(INT_MIN));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这给出了我的 32 位机器上的输出:
INT_MAX: 2147483647
INT_MIN: -2147483648
absu(INT_MIN): 2147483648
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
28169 次 |
最近记录: |