0x3f~0x3f3f3f3f的来龙去脉(详解)

您所在的位置:网站首页 正无穷是什么 0x3f~0x3f3f3f3f的来龙去脉(详解)

0x3f~0x3f3f3f3f的来龙去脉(详解)

2024-06-20 23:48| 来源: 网络整理| 查看: 265

       在使用程序进行解决问题时,时常需要将一些变量初始化为一个极大值,比如说无限大+∞,但是计算机的存储空间是有限的,不可能存储一个无限大的数,所以一般采用0x3f3f3f3f作为一个极大值来代表无限大。

int m = 0x3f3f3f3f; printf("%d", m);

输出:

1061109567 //是一个很大的数,可以用来代表+∞; //并且以该值代表+∞,+∞ + +∞也不会超出范围; //是一个比较理想的代替+∞的数值;

上述内容很容易理解,当我们对一个数组进行初始化时,可以使用memset()函数。

【一维数组】

全为“0”:

int a[10]; memset(a, 0, sizeof a); for(int i = 0; i < 10; i ++) printf("%d ", a[i]);

输出:

0 0 0 0 0 0 0 0 0 0

全为“0x3f3f3f3f”:

int a[10]; memset(a, 0x3f3f3f3f, sizeof a); for(int i = 0; i < 10; i ++) printf("%d ", a[i]);

输出:

1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567

【二维数组】

全为“0x3f3f3f3f”:

int a[10][10]; memset(a, 0x3f3f3f3f, sizeof a); for(int i = 0; i < 10; i ++){ for(int j = 0; j < 10; j ++) printf("%d ", a[i][j]); printf("\n"); }

输出:

1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567

#!#!#!对数组使用memset()函数初始化为最大值还有一种办法:

 【一维数组】

#将memset(a, 0x3f3f3f3f, sizeof a);中的0x3f3f3f3f改为0x3f#

同样也可达到效果。

全为“0x3f3f3f3f”:

int a[10]; memset(a, 0x3f, sizeof a); for(int i = 0; i < 10; i ++) printf("%d ", a[i]);

输出:

1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567

【二维数组】

全为“0x3f3f3f3f”:

int a[10][10]; memset(a, 0x3f, sizeof a); for(int i = 0; i < 10; i ++){ for(int j = 0; j < 10; j ++) printf("%d ", a[i][j]); printf("\n"); }

输出:

1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567 1061109567

此时,有些同学可能就搞混了,难道“0x3f”也代表无穷大吗?

我们来看看0x3f、0x3f3f、0x3f3f3f、0x3f3f3f3f分别等于多少:

int a, b, c, d; a = 0x3f; b = 0x3f3f; c = 0x3f3f3f; d = 0x3f3f3f3f; printf("%d\n%d\n%d\n%d", a, b, c, d);

输出:

63 16191 4144959 1061109567

所以“0x3f”其实等于63,那为什么这个值使用在memset()函数中,作用相当于“0x3f3f3f3f”呢?

是因为memset()是对char操作,即一个字节一个字节的操作,如果此时初始化的变量a为int类型(4字节),那么:

memset(a, 0x3f, sizeof a); //0x是十六进制的意思;

其实是对a的每一个字节初始化为“3f”,这样a的4个字节都为“3f”,a的值为“3f3f3f3f”

参考资料:

关于0x3f和0x3f3f3f3f_辞树325的博客-CSDN博客文章浏览阅读1k次,点赞8次,收藏11次。因为memset()是对char操作,即一个字节一个字节的操作,而如果p恰好是int型(四字节),就可以将int的四个字节中的每个字节都设置为3f,int就变为了3f3f3f3f(提示0x是十六进制数的标志)相比0x7fffffff,0x3f3f3f3f在做图论题时,(如Dijkstra算法)相加时不会使正无穷溢出导致变成负数,在做题时经常将0x3f3f3f3设为INF(正无穷)使用0x3f的场景一般是。..._0x3f和0x3f3f3f3fhttps://blog.csdn.net/weixin_62754360/article/details/125943701?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22125943701%22%2C%22source%22%3A%22wenhaoyan%22%7D&fromshare=blogdetail

【精选】memset的用法详解_薛定谔的猫ovo的博客-CSDN博客文章浏览阅读10w+次,点赞706次,收藏3.4k次。文章目录memset简介需要说明的几个地方不能任意赋值注意所要赋值的数组的元素类型关于所要赋值的字符数的写法具体用法实例总结memset简介memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。void *memset(void *s, int c, size_t n); s指向要填充的内存块。c是要被设置的值。n是要被设置该值的字符数。返回类型是一个指向存储区s的指针。需要说明的几个地方不能任意赋值memset函数是按照字节对内存块进行初始化,所以不能用它将in_memsethttps://blog.csdn.net/weixin_44162361/article/details/115790452



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3