学习借鉴自: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. java 8 Lambda

    警告: 初学者随笔, 请关闭此网页, 以免浪费你的时间

  2. Spring-----入门

    Spring 入门 一.首先导入核心jar包 commons-logging-1.1.3.jar                 日志        spring-beans-4.2.4.RELEAS ...

  3. Linux安装TeamViewer

    1.下载teamview centos版本 官网只有rpm版本,附件中即为官网下载的teamview最新版本 (下载tar包方式,我这里打不开teamviewer的界面,所以这里不推荐) 官方下载地址 ...

  4. 【Java集合系列四】HashSet和LinkedHashSet解析

    2017-07-29 16:58:13 一.简介 1.Set概念 Set可以理解为集合,非常类似数据概念中的集合,集合三大特征:1.确定性:2.互异性:3.无序性,因此Set实现类也有类似的特征. 2 ...

  5. 详细介绍Ubuntu 16.04系统环境安装Docker CE容器的过程

    由于项目的需要,我们在很多软件配置环境中需要用到Docker容器,这个时候我们可以用自己的VPS主机搭建.在这篇文章中,笔者将会利用Ubuntu 16.04系统环境安装Docker CE容器的过程.如 ...

  6. centos7 下 安装部署nginx

    centos7 下 安装部署nginx 1.nginx安装依赖于三个包,注意安装顺序 a.SSL功能需要openssl库,直接通过yum安装: #yum install openssl b.gzip模 ...

  7. sse矩阵乘法 应该是1毫秒纯运算1000次

    #include <intrin.h> #include <math.h> struct Vector4 { float x, y, z, w; }; struct Matri ...

  8. 今天捡起来python

    时隔多少,我还是要学习,之前懒,结果有些就忘了,用笨方法学Python,码代码夹理解运行改正也就20多分钟,主要是加分习题,你一扩展就要思考的时间长了所以大概要留出1个小时来做他,好了该复习前面的了

  9. Gurobi在Python环境里安装与使用(Windows环境)

  10. 读取HeidiSQL 配置文件中的密码

    读取HeidiSQL 配置文件中的密码 2017-1-21 5:42:01 codegay HeidiSQL是一款开源的SQL管理工具,用管理MYSQL,MSSQL 等数据库, 很多管理工具都会把密码 ...