问题起源:

  这几天在刷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. oracle 表空间管理相关(原创)

    通过以下几步基本可以查看表空间情况以及处理表空间不足问题. ASM相关 查看asm空间 select group_number,name,total_mb,free_mb from v$asm_dis ...

  2. mongodb副本集基于centos7部署

    安装mongodb,基于端口的安装三个节点 下载安装MongoDB安装包 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel ...

  3. centos 安装python3与Python2并存,并解决"smtplib" object has no attribute 'SMTP_SSL'的错误

    1.需要先安装python3依赖的包yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readli ...

  4. python学习之——习题一

    习题一:使用while循环输入1 2 3 4 5 6   8 9 10 (不含7) 首先想到,先使用while循环打印出1-10数字,然后再将数字“7”剔除. # 先打印出1-10 n = 1 whi ...

  5. Elasticsearch .net client NEST使用说明 2.x -更新版

    Elasticsearch .net client NEST使用说明 目录: Elasticsearch .net client NEST 5.x 使用总结 elasticsearch_.net_cl ...

  6. 最短Hamilton路径【状压DP】

    给定一张 nn 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次. 输入 ...

  7. 读书笔记--《编写高质量代码:改善Python程序的91个建议》

      第一章 引论 建议写Pythonic式的代码,我理解为充分利用pythonAPI,用最简洁方式写出代码 1.两个变量交换: a, b = b, a 2.翻转list: a = [1, 2, 3, ...

  8. 用户端访问centos7上面的tomcat,访问页面出现的非常的慢?

    原因:因为客户端访问centos7上面的tomcat会先 建立session连接,这个连接会用到random的随机数,在linux系统中有一个熵池的概念(熵池是一个内核参数), 他要 用熵池里面的随机 ...

  9. 'telnet' 不是内部或外部命令,也不是可运行的程序

    1.打开控制面板 2. 3. 4.这样就好可,重新打开cmd命令.

  10. TreeMap/LinkedHashMap/HashMap按键排序和按值排序

    今天做统计时需要对X轴的地区按照地区代码(areaCode)进行排序,由于在构建XMLData使用的map来进行数据统计的,所以在统计过程中就需要对map进行排序. 一.简单介绍Map 在讲解Map排 ...