关于memset函数--赋最大值
问题起源:
这几天在刷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函数--赋最大值的更多相关文章
- 如何给数组用fill函数和memset函数给数组赋初值
fill是按照单元来赋值的,所以可以填充一个区间的任意值 #include<iostream> #include<stdio.h> #include<string.h&g ...
- 2018/08/23 cstring中memset()函数的运用
好多东西其实以前已经查过了,然后当时理解的还行,可是过段时间没用有些又会忘记,然后又去找资料又查,浪费了不少的时间和精力,所以,我,曾国强,今天起,要好好做笔记了! 今天复习第一个知识点,为什么要叫复 ...
- memset函数的使用
void *memset(void *s, int ch, size_t n); 说明:将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s 关于mem ...
- memset函数用法
1. memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组 c:是赋给buffer的值 cou ...
- memset()函数及其作用(转)
1. memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组, c:是赋给buffer的值, c ...
- memset()函数
memset需要的头文件 <memory.h> or <string.h> memset <wchar.h> wmemset 函数介绍 void *memset( ...
- memset()函数用法及其作用
memset()函数原型是: extern void *memset(void *buffer, int c, int count) //buffer:为指针或是数组, //c:是赋给buffer的值 ...
- 一直误解的memset函数
1.“想当然”导致的后果 今天犯了一个十分低级的错误,在对一个整型数组用memset进行初始化设置所有元素值为1.可是结果却大出所料,很意外啊!接着,我就做了代码测试. #include <io ...
- memset函数用法及注意事项
头文件 #include<cstring>// or #include<memory.h> ------------------------------------------ ...
随机推荐
- opencv学习之路(29)、轮廓查找与绘制(八)——轮廓特征属性及应用
一.简介 HSV颜色空间(hue色调,saturation饱和度,value亮度) 二.HSV滑动条 #include "opencv2/opencv.hpp" #include ...
- PyGame实现情人节表白利器
前提:写不出那么那个的话哇,随便写写,随便看看,重在代码(文章末尾有免费完整源代码) 实验环境: pygame 1.9.4 pycharm python3.6 实现思路: pygame.display ...
- 动态令牌验证遇到的问题(判断用户长按backspace键)
因为最近负责泰康项目的前端工作,他们的登录需要进行安全验证,也就是所谓的双因素验证,即在OA平台登录过后,还需要安全部门发送安全令牌进行验证.令牌验证效果如下: 主要功能有:1.默认第一项focus. ...
- appium-android 遇到swipe函数无法使用的问题及解决办法
问题:cannot resolve method swipe() 问题出现原因:File->Project Structure->Modules->Dependencies-> ...
- Windoes包管理工具(Scoop)
Windoes包管理工具(Scoop) 对于习惯了apt-get,brew等工具的开发者来说,Windows下配置环境相对繁琐,这里推荐Win下的包管理工具Scoop. Win 包管理工具 Choco ...
- 利用 Charles Proxy 下载旧版本 iOS App
一.软件准备 1.旧版本 iTunes1.IPSW Downloads:https://ipsw.me/2.百度网盘链接: https://pan.baidu.com/s/1PO9Z12o-rqZ_J ...
- JDBC中execute、executeQuery和executeUpdate的区别
Statement 接口提供了三种执行 SQL 语句的方法:executeQuery.executeUpdate 和 execute.使用哪一个方法由 SQL 语句所产生的内容决定. 1>方法e ...
- 环境准备—之—linux下安装python3和pip3
转自 上海悠悠 https://www.cnblogs.com/yoyoketang/p/10195102.html 前言 centos7 自带有 python,但是却是 python2 版本的 py ...
- hbase的api操作之过滤器
Comparison Filter: 对比过滤器: 1.RowFilter select * from ns1:t1 where rowkey <= row100 ...
- java的equals()与hashCode()以及包装类中的实现
1. hashcode 1.1 hashcode来源 1.2 hashcode的形式 1.3 hashcode目的 1.4 hashcode规则 1.5 hashcode作用体现 1.6 重写hash ...