0x3f3f3f3f,0x7fffffff 用于赋值

本文介绍了memset函数,它按字节赋值,常用于给char数组赋0或 -1。还讲述了用memset初始化无穷大,int最大值为0x7fffffff,但图论中该值不适用,0x3f3f3f3f更合适,满足无穷大加有穷数仍是无穷大的要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. memset函数

memset函数是按字节进行赋值的,经常用于赋值0或者-1, 但正规的用法应该是用于char数组的, 即只能赋值为0x00到0xFF, 例如memset(,0xff,sizeof())时,0xff转为二进制11111111,int为4字节所以最后为11111111111111111111111111111111为-1。(化为二进制补位,然后再赋值)。
能够赋值0, -1的原因是:0的二进制位000000000000000000000000000000000,-1的二进制就是11111111111111111111111111111111,所以memset可以直接初始化0, -1

2. 用memset函数初始无穷大

int类型最大数为0x7fffffff
memset(num,0x7F,sizeof(num)); //它将num中的值全部赋为2139062143,这是用memset对int赋值所能达到的最大值
但图论需要一个无穷大加一个有穷的数依然是无穷大的数, 此时不能取0x7fffffff, 因为此时两数相加会得到一个很小的数
0x3f3f3f3f 是一个非常合适的数, 他满足无穷大加一个有穷的数依然是无穷大的数这个要求, 0x3f3f3f3f的十进制是1061109567,也就是10^9级别的也满足了对无穷大的需求
设置的时候只需要memset(num,0x3f,sizeof(num))

3. 总结

1. 0x7fffffff :int的最大值, 0x7 后跟7个f,memset (num,0x7f,sizeof(num));
2. 0x3f3f3f3f, 1061109567, 0x后跟4个3f, memset(num,0x3f,sizeof(num))
### 十六进制常量 0x3f 0x3f3f3f3f 的区别及用法 #### 数值大小 十六进制常量 `0x3f` 表示的数值为 63,而 `0x3f3f3f3f` 表示的数值为 1,061,109,567[^1]。从数值上看,`0x3f` 是一个较小的数,通常用于表示有限范围内的值或作为位掩码操作的一部分。而 `0x3f3f3f3f` 是一个较大的数,接近于十亿(10^9),在编程中通常被用作“无穷大”的近似值。 #### 在内存初始化中的应用 `0x3f3f3f3f` 可以通过 `memset` 函数快速初始化数组[^4]。由于 `memset` 是按字节操作的,将每个字节设置为 `0x3f` 时,对于一个四字节的整数,其结果就是 `0x3f3f3f3f`。这种方法效率高且简单,适合需要频繁初始化数组的场景,例如动态规划问题中的状态转移矩阵初始化。 #### 溢出特性与适用场景 - **`0x3f`**:由于其数值较小(63),通常不适用于表示“无穷大”。它更多地出现在位运算或特定算法的小范围数值处理中。 - **`0x3f3f3f3f`**:该值在加法运算中不容易溢出,并且满足“无穷大加有穷数仍为无穷大”的需求[^5]。因此,在需要频繁进行加法运算的算法中(如最短路径算法中的松弛操作),`0x3f3f3f3f` 是一个更好的选择。 #### 示例代码 以下是一个使用 `0x3f3f3f3f` 初始化数组并计算最小值的示例: ```cpp #include <cstdio> #include <cstring> const int INF = 0x3f3f3f3f; int main() { int a[10]; memset(a, 0x3f, sizeof(a)); // 快速初始化数组为 INF for (int i = 0; i < 10; ++i) { printf("%d ", a[i]); } return 0; } ``` #### 与标准常量的区别 - **`INT_MAX`**:`INT_MAX` 是 C/C++ 中的标准常量,对应 0x7fffffff,即最大的 32 位有符号整数。然而,`INT_MAX` 在加法运算中容易溢出,导致负数结果,这在动态规划或图论等算法中可能引发错误。 - **`LLONG_MAX`**:`LLONG_MAX` 是更大的常量,适用于需要处理超过 `0x3f3f3f3f` 范围的场景,但不能通过 `memset` 快速初始化数组[^3]。 ### 总结 `0x3f` `0x3f3f3f3f` 的主要区别在于数值大小应用场景。前者适用于小范围数值或位运算,后者则作为“无穷大”的近似值广泛应用于动态规划、最短路径等问题中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值