问题起源:

  这几天在刷CCF的时候,图论那边经常用到赋最大值,一开始自己一直手工for循环赋值(INT_MAX或者是LONG_LONG_MAX),后来看到别人的代码,发现了一个比较高端的赋值  memset(起始地址,初始值,大小)(注:看到后才想起来OS里面有用到过)。代码简单啊,用的乐此不疲。

问题:

  直到赋值 memset(起始地址,INT_MAX,大小)的时候,调试的时候发现一直是负数,又用一个具体的数去赋值,发现还是负数(令我很懵。。)。有点得过且过的意思,就直接改用原来的for循环代替了。但问题是用此方法之前赋值0,-1的时候没有问题啊。好多次都这样,终于再也忍不了了,还是去查一查why

原因:

  1.为什么我赋值了INT_MAX,出来的却是负数?(或者是其他具体值)

    memset函数是以字节为单位来赋值的,即每个字节(注意是字节)的赋值是相同的。如果赋值的数值的二进制超过了一个字节,那么函数取的是该数值的最后一个字节的值

  EG:257的最后两个字节的二进制(补码)为:0000 0001 0000 0001,那么函数将0000 0001(最后一个字节),赋值给每一个地址,int 为4个字节,那么其计算十进制时,就有可能为负数(当字节最高位为1时)。

  2.为什么赋值0和-1的时候是没有问题的?

    本质还是1中的,0补码为全0,-1补码为全1,所以截取最后一个字节,在填充每个地址的时候,没有变化,所以值没有变。

用法:

  1.怎么用memset赋最大值?

    网上流传的是用 0x3f 来初始化,而不是用 0x7f(符号位为0,所以字节的最高为必须为0),至于为什么,大家说是因为:2个 0x7f7f7f7f 相加之后,会负溢出,所以还是用 0x3f 保险,而且用它来表示无穷大也是满足需求的(注:这个原因体会不深。。。还是看情况吧,我觉得根据实际情况而定,用 0x7f7f7f7f 也是可以的,等到出bug 了,体会就深刻了。。。)(刚刚写完说不深刻,果然真香,刚刚提交的代码就是因为这个原因出Bug——因为在图论中经常需要两个距离相加,所以还是用 0x3f好了)

    另外,有时候还能看到不用memset赋值,直接赋最大值为 0x7fffffff,也有些直接赋值为 0x7f7f7f7f 也都是可以的(只要满足你心中的MAX或者是题目中的要求了,都是可以的)

  2.怎么用memset对结构体或者结构体数组赋初始值?

    本质是一样的,所以用法跟平常的数组也是一样的。

EG:

关于memset函数--赋最大值的更多相关文章

  1. 如何给数组用fill函数和memset函数给数组赋初值

    fill是按照单元来赋值的,所以可以填充一个区间的任意值 #include<iostream> #include<stdio.h> #include<string.h&g ...

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

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

  3. memset函数的使用

    void *memset(void *s, int ch, size_t n); 说明:将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s 关于mem ...

  4. memset函数用法

    1. memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组 c:是赋给buffer的值 cou ...

  5. memset()函数及其作用(转)

    1. memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组, c:是赋给buffer的值, c ...

  6. memset()函数

    memset需要的头文件 <memory.h> or <string.h> memset <wchar.h> wmemset  函数介绍 void *memset( ...

  7. memset()函数用法及其作用

    memset()函数原型是: extern void *memset(void *buffer, int c, int count) //buffer:为指针或是数组, //c:是赋给buffer的值 ...

  8. 一直误解的memset函数

    1.“想当然”导致的后果 今天犯了一个十分低级的错误,在对一个整型数组用memset进行初始化设置所有元素值为1.可是结果却大出所料,很意外啊!接着,我就做了代码测试. #include <io ...

  9. memset函数用法及注意事项

    头文件 #include<cstring>// or #include<memory.h> ------------------------------------------ ...

随机推荐

  1. CEF 支持的命令行参数

    参考:https://peter.sh/experiments/chromium-command-line-switches/ List of Chromium Command Line Switch ...

  2. 软件测试1gkd

        通过老师课上的讲解以及对书本和百度百科的学习,我对软件测试有如下的理解.     软件开发的最基本要求是按时.高质量地发布软件产品,而软件测试是软件质量保证的最重要的手段之一.在整个软件生命周 ...

  3. linux基础之加密解密、PKI及SSL、创建私有CA

    加密解密基础 1. 对称加密: 加密和解密使用同一个密钥 常见的加密算法有:DES.3DES.AES.Blowfish.Twofish.IDEA.RC6.CAST5 特性: 1. 加密.解密使用同一个 ...

  4. 为git关联编辑器(比如notepad++) Associating text editors with Git

    Associating text editors with git Using Notepad++ as your editors you can set your default editor in ...

  5. visual studio code——运行python

    How to run Python in Visual Studio Code Getting Started with Python in VS Code python教程 vs code 安装py ...

  6. [转载]vb 时间戳与时间互转

    转自:https://blog.csdn.net/boys1999/article/details/23298415 vb 时间戳与时间互转 2014年04月09日 21:13:47 boys1999 ...

  7. 7_linux用户及权限(2)和管理

    useradd:useradd [options] USERNAME -u UID -g GID(基本组) -G GID,...(附加组) //省略号表示可以有多个,彼此之间用逗号隔开 -c &quo ...

  8. linux环境下 python环境import找不到自定义的模块

    linux环境下 python环境import找不到自定义的模块 问题现象: Linux环境中自定义的模块swport,import swport 出错.swport模块在/root/sw/目录下. ...

  9. linux shell 脚本 svn自动更新项目并且打包 、发布、备份

    这里先准备一个配置文件,用于保存svn地址.目的路径.用户名跟密码 配置文件名问:toolConfig.properties #svn地址 svnAddress=https://192.168.1.2 ...

  10. java之JVM(一)

    内存模型: Java内存模型建立在自动内存管理的概念之上.当一个对象不再被一个应用所引用,垃圾回收器就会回收它,从而释放相应的内存. JVM从底层操作系统中分配内存,并将它们分为以下几个区域: 方法区 ...