C语言:探测 unsigned int 的边界

本文探讨了C语言中不同数值类型的边界,包括无符号和有符号整型的最大最小值,并通过示例代码演示了如何确定这些边界。

C语言中数值类型是讲范围的,看你有几位,或者有几个字节。如果你给的数值大于当前类型表达的范围,就会产生溢出。

溢出是很有意义的,如果没有溢出,那么负数就无法表达了。正负数之间的加法运算就不能正确执行。(通过溢出,所以可以正确得出-1+1=0)

按照这种转圈理论,max unsigned int = 0-1; 实际结果也的确如此。

#include <stdio.h>
/*
unsigned int 的边界是多少?
*/
int main(int argc, char const *argv[])
{

    unsigned char a = 0;

    a--;
    printf("unsigned char max number = %d\n", a);
    unsigned int b = 0;

    b--;
    printf("unsigned int max nunber =  %u\n", b);

    char c = 0;
    while(--c <0);
    printf("signed char max number = %d\n",c );
    c++;
    printf("signed char min number = %d\n",c);
    int d = 0;
    while (--d<0);
    printf("signed int max number = %d\n",d );
    d++;
    printf("signed int min number = %d\n",d );
    return 0;
}

结果输出:
clang: warning: treating ‘c’ input as ‘c++’ when in C++ mode, this behavior is deprecated [-Wdeprecated]
unsigned char max number = 255
unsigned int max number = 4294967295
signed char max number = 127
signed char min number = -128
signed int max number = 2147483647
signed int min number = -2147483648
[Finished in 3.2s]

### C语言判断溢出的方法及代码示例 在C语言中,溢出是一种常见的问题,可能发生在整数运算、栈操作或缓冲区处理等场景中。以下是几种常见类型的溢出及其判断方法。 #### 1. 整数溢出判断 整数溢出是指当计算结果超出了数据类型所能表示的范围时发生的现象。以下是一个整数加法溢出的判断方法: ```c #include <limits.h> #include <stdio.h> // 判断整数加法是否溢出 int add(int a, int b, int *result) { if (b > 0 && a > INT_MAX - b) return 1; // 正溢出 if (b < 0 && a < INT_MIN - b) return 1; // 负溢出 *result = a + b; return 0; } int main() { int a = INT_MAX, b = 1; int result; if (add(a, b, &result)) { printf("Overflow occurred!\n"); } else { printf("Result: %d\n", result); } return 0; } ``` 上述代码通过检查 `a + b` 是否超出 `INT_MAX` 或低于 `INT_MIN` 来判断是否存在溢出[^2]。 #### 2. 乘法溢出判断 乘法溢出可以通过类似的方法进行检测。以下是一个示例: ```c #include <limits.h> #include <stdio.h> // 判断整数乘法是否溢出 int multiply(int a, int b, int *result) { if (b > 0) { if (a > INT_MAX / b || a < INT_MIN / b) return 1; // 溢出 } else if (b < 0) { if (a > INT_MIN / b || a < INT_MAX / b) return 1; // 溢出 } *result = a * b; return 0; } int main() { int a = INT_MAX, b = 2; int result; if (multiply(a, b, &result)) { printf("Overflow occurred!\n"); } else { printf("Result: %d\n", result); } return 0; } ``` 此代码通过比较 `a` 和 `INT_MAX / b` 或 `INT_MIN / b` 的大小来判断是否存在乘法溢出。 #### 3. 栈溢出判断 栈溢出通常发生在递归调用过深或局部变量占用过多内存的情况下。虽然C语言本身没有直接的机制来检测栈溢出,但可以通过限制递归深度或使用信号处理程序捕获异常来间接实现。以下是一个简单的递归深度限制示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_DEPTH 1000 void recursive_function(int depth) { if (depth > MAX_DEPTH) { printf("Stack overflow detected!\n"); exit(1); } printf("Depth: %d\n", depth); recursive_function(depth + 1); } int main() { recursive_function(0); return 0; } ``` 通过设置一个最大递归深度 `MAX_DEPTH`,可以有效避免栈溢出的发生[^1]。 #### 4. 缓冲区溢出判断 缓冲区溢出通常是由于对数组或字符串的越界访问引起的。以下是一个简单的缓冲区溢出检测示例: ```c #include <stdio.h> #include <string.h> void check_buffer_overflow(char *buffer, size_t buffer_size, const char *input) { if (strlen(input) >= buffer_size) { printf("Buffer overflow detected!\n"); return; } strncpy(buffer, input, buffer_size - 1); buffer[buffer_size - 1] = '\0'; } int main() { char buffer[10]; const char *input = "This is too long!"; check_buffer_overflow(buffer, sizeof(buffer), input); return 0; } ``` 上述代码通过比较输入字符串长度与缓冲区大小来防止缓冲区溢出[^3]。 --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值