学习借鉴自:https://blog.csdn.net/yexiaohhjk/article/details/52717934

memset是C语言头文件<string.h>中的一个函数,作用是在一段内存块中填充某个给定的值,它是对较大的结构体数组进行清零操作的一种最快方法

memset(数组名,赋值变量,数组长度);

void *memset(void *s, int ch, size_t n);

初始化清零是  memset(a,0,sizeof(a));
初始化无穷大是  memset(a,0x3f,sizeof(0x3f));

memset的赋值规则:

逐一对数组范围内的每个字节进行赋值(一字节 = 8_bit,1_bit = 一位二进制数)也就是也就赋值有效数值在8_bit(两位16进制);

假设我们对一个长度为2的int型数组进行赋值 0x3f4f5f6f(0x表示16进制,该数表示6进制数3F4F5F6F)memset(a,0x3f4f5f6f,sizeof(a))

在存储单元中就将得到 6F 6F 6F 6F    6F 6F 6F 6F

那么坑人的问题就出来了 a[0]=6F 6F 6F 6F ,而我们原来要的结果是把0x3f4f5f6f赋值给a数组;

当我们要用0x3f4f5f6f与a数组中的值对比时你就会发现不等于,那么我们的赋值就失去意义

现在我们用0x6f 赋值:

在存储单元中就将得到 6F 6F 6F 6F    6F 6F 6F 6F

#include<cstring>//C语言头文件在C++中的用法
#include<cstdio>
using namespace std;
int main(){
int a[];
printf("a数组字节数:\n%d\n",sizeof(a)); memset(a,0x6f,sizeof(a));
printf("给a数组赋值为0x6f:\n");
for(int i=;i<;i++)
printf("%d ",a[i]);
printf("\n"); memset(a,0x3f4f5f6f,sizeof(a));
printf("给a数组赋值为0x3f4f5f6f:\n");
for(int i=;i<;i++)
printf("%d ",a[i]);
printf("\n"); printf("赋值0x3f4f5f6f后的数组是否于0x3f4f5f6f相等:");
if(a[]==0x3f4f5f6f)
printf("yes");
else
printf("no");
return ;
}

当memset(,1,sizeof()); 1转为二进制0000 0001,当做一字节,一字节8位,int为4字节,所以初始化完每个数为0000 0001 0000 0001 0000 0001 0000 0001 = 16843009;

赋值无穷大问题:

这个问题是在我做最短路问题时,遇到的明明代码对了,却一直得不到想要的答案,最后对比别人的代码发现问题原来我的预设的无穷大值是0x3f3f3f;

那么就会出现上述的问题,数组值不等于我们赋的值。

赋值int型时,int型的位数根据编译器而定,现在一般主流的编辑器都是4字节,赋无穷大值时我们一般赋值所有 bit 位全 1 ,留一位当符号位,其余全1刚好是0x7fffffff

为什么无穷大值不取0x7fffffff,这个数是32_bit中最大的值,而取0x3f3f3f3f或0x3f(取0x3f时比较相等要和0x3f3f3f3f比),在编程过程中我们给一个数组赋值后是需要使用的,

如果你设置一个这么大的数的话,当进行加和操作的时候很容易数据溢出,而得到一个负数。所以这个数还需要能做的“无穷大加无穷大等于无穷大”,所以我们取0x3f3f3f3f或0x3f。

数值上0x3f3f3f3f是10^9,一般当无穷大已经够了,又满足“无穷大加无穷大等于无穷大”

关于memset赋值问题的更多相关文章

  1. 关于memset赋值无穷大无穷小

    memset(a,,sizeof(a)); 即得到无穷大. memset(a,,sizeof(a)); 即得到无穷小,与上述的值互为相反数. memset(a,,sizeof(a)); 即近似为第一个 ...

  2. memset赋值

    比较神奇的事情 可能和二进制有关系吧 #include<bits/stdc++.h> using namespace std; ]; int main(){ memset(f,,sizeo ...

  3. 关于memset的赋值(最大值最小值的选择)

    memset赋值赋的是ASSCII码转为二进制赋值 比如 memset(,0xff,sizeof()),0xff转为二进制11111111,int为4字节所以最后为111111111111111111 ...

  4. 关于memset函数--赋最大值

    问题起源: 这几天在刷CCF的时候,图论那边经常用到赋最大值,一开始自己一直手工for循环赋值(INT_MAX或者是LONG_LONG_MAX),后来看到别人的代码,发现了一个比较高端的赋值  mem ...

  5. 2018/08/23 cstring中memset()函数的运用

    好多东西其实以前已经查过了,然后当时理解的还行,可是过段时间没用有些又会忘记,然后又去找资料又查,浪费了不少的时间和精力,所以,我,曾国强,今天起,要好好做笔记了! 今天复习第一个知识点,为什么要叫复 ...

  6. 使用memset初始化int数组

    memset()是一个来自于string库的函数,正规用法是初始化char类型的数组.因为char类型只占1个字节,memset按字节赋值后,会将char类型数组的所有元素变为你指定的值.但是4字节的 ...

  7. 关于memset的使用

    有些oj上的G++支持 cstdio的memset,有些则支持stdio.h中的memset(划掉) 这两个头文件关系比较复杂, 具体我也说不清...按照c++文档中的说法,stdio已经deprec ...

  8. POJ 1088

    http://poj.org/problem?id=1088 一道中文题,这道题如果不限时的话,是个简单的搜索,但限时的话,就要用记忆化搜索 所谓记忆化搜索就是对每一次搜索的结果进行记录,然后之后的如 ...

  9. 【细小碎的oi小知识点总结贴】不定时更新(显然也没人看qwq)

    1.memcpy: 从a数组中复制k个元素到b数组: memcpy(b,a,sizeof(int)*k); #include<cstring> #include<iostream&g ...

随机推荐

  1. js中浅拷贝和深拷贝以及深拷贝的实现

    前言:2019年的第一篇分享... 一.什么是基本类型值和引用类型值?ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型.基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构 ...

  2. python基础之作业2----购物车小练习

    product_list = [    ("Iphone",6000),    ("Mac pro",12800),    ("Bike", ...

  3. EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】

    前言 本篇是上一篇EFCore Lazy Loading + Inheritance = 干净的数据表 (一) [献给处女座的DB First程序猿] 前菜 的续篇.这一篇才是真的为处女座的DB Fi ...

  4. Python3的基础

    Python的3.0版本,常被称为Python 3000,或简称Py3k. 关于Python版本的下载:https://www.python.org/,以及Anaconda的下载:https://ww ...

  5. java线程入门一

    线程优先级: 在JAVA线程中,通过一个int型变量priority来控制线程优先级,线程的有限机为1-10,默认为5,优先级高的线程获得的运行时间要高于优先级低的线程.但这只是一个提示,操作系统和J ...

  6. TP自动提取关键词

    protected function _before_insert(&$data, $option) {        $data['create_time'] = time();       ...

  7. ng-model-options 时延

    ng-model-options="{updateOn: 'blur'}" 失去焦点时生效 ng-model-options="{debounce:500}" ...

  8. Sql Server 2012 集群配置

    基于Windows Server 2008 R2的WSFC实现SQL Server 2012高可用性组(AlwaysOn Group) 2012年5月 微软新一代数据库产品SQL Server 201 ...

  9. nmon的安装使用

    一.下载Nmon 根据CPU的类型选择下载相应的版本: http://nmon.sourceforge.net/pmwiki.php?n=Site.Download http://sourceforg ...

  10. tensorFlow入门实践(一)

    首先应用TensorFlow完成一个线性回归,了解TensorFlow的数据类型和运行机制. import tensorflow as tf import numpy as np import mat ...