memset 里‘零’的不同表示

sinosinux 2010-04-02 03:16:52
我看有些代码中在使用memset时,0都是采用16进制的写法:


char szBuf[BFSZ + 1];
memset(szBuf, 0x00, sizeof(szBuf));


0x00写成0算了,还少敲几下键盘。写成0x00形式有什么目的吗? 比如可读性,可移植性考虑?

谢谢
...全文
375 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
melibaobei5 2010-04-03
  • 打赏
  • 举报
回复
学习~!
csucdl 2010-04-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 sinosinux 的回复:]
我看有些代码中在使用memset时,0都是采用16进制的写法:

C/C++ code

char szBuf[BFSZ + 1];
memset(szBuf, 0x00, sizeof(szBuf));



0x00写成0算了,还少敲几下键盘。写成0x00形式有什么目的吗? 比如可读性,可移植性考虑?

谢谢
[/Quote]

0x00比直接用0可读性要高些, 因为0x00刚好是一个字节, 也就是一个内存单元, 这个内存单元的每一位都为0。
mymtom 2010-04-03
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 lbjfeng 的回复:]

应该是楼上们所说,为了方便可读性。

告诉人们,这个是八位,一个字节
[/Quote]
可这本来就是错误的呀。
memset要的是一个int类型。
Tauren_Chieftan 2010-04-03
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 fancymouse 的回复:]

>写成0x00形式有什么目的吗?
没有。纯粹人家蛋疼。
[/Quote]

写成16进制形式优点多多。
搞嵌入式的都知道。
习惯位运算的都知道。
FancyMouse 2010-04-03
  • 打赏
  • 举报
回复
>写成0x00形式有什么目的吗?
没有。纯粹人家蛋疼。
GoForSky 2010-04-03
  • 打赏
  • 举报
回复



memset(szBuf, 0x00, sizeof(szBuf));
按字节赋值,看着多舒服呀
字节前4为是0000,后4位是0000



lxb316 2010-04-02
  • 打赏
  • 举报
回复
学习~~~
lbjfeng 2010-04-02
  • 打赏
  • 举报
回复
应该是楼上们所说,为了方便可读性。

告诉人们,这个是八位,一个字节
mymtom 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 haosuai 的回复:]

这个问题,我也研究过,如果要说写成
memset(szBuf, (unsigned char)0x00, sizeof(szBuf));

memset(szBuf, 0, sizeof(szBuf));意义不大,不过搞单片机的大大都习惯“0x00”的写法。
但是写成
memset(szBuf, '\0', sizeof(szBuf));在一般的CHAR *类型的变量的时候,还是比较……
[/Quote]
有没有搞错啊,这么多于多于啊,0x00还不够冗长吗,还要加什么(unsigned char).
memset的第二个参数本来就是int类型的。

#include <string.h>

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

我都是用:
memset(s, 0, n);
lanseshenhua 2010-04-02
  • 打赏
  • 举报
回复
我认为是等同的。
haosuai 2010-04-02
  • 打赏
  • 举报
回复
这个问题,我也研究过,如果要说写成
memset(szBuf, (unsigned char)0x00, sizeof(szBuf));

memset(szBuf, 0, sizeof(szBuf));意义不大,不过搞单片机的大大都习惯“0x00”的写法。
但是写成
memset(szBuf, '\0', sizeof(szBuf));在一般的CHAR *类型的变量的时候,还是比较有可读性的。
一眼就知道。
所以建议在CHAR *类型的变量使用memset的时候,使用memset(szBuf, '\0', sizeof(szBuf));写法比较好。
kevinyujm 2010-04-02
  • 打赏
  • 举报
回复
另外,习惯这样写的人,不光是对memset这个函数,几乎所有的数字他都喜欢这样写。
0x1, 0xff, ...
看惯了16进制的,看10进制反而累。0xFFFF -> 65535 ? 10进制位数多,而且反映不出bit的排布!
kevinyujm 2010-04-02
  • 打赏
  • 举报
回复

这种写法比较多地出现在做嵌入式/单片机开发中。
一是因为直接和地址打交道的情况比较多。
二是因为开发中位操作也比较多,这样写容易核对。
三是以为开发资料上也是用16进制介绍,潜移默化。
总之就是习惯用0xABCD。。。这种写法了。

至于移植的事,关系不大,如果0被编译器识别为整形,那么0x00也绝对是整形。
除非这样:
memset(szBuf, (unsigned char)0x00, sizeof(szBuf));

楼主大可不必费神研究。
kevinyujm 2010-04-02
  • 打赏
  • 举报
回复
习惯问题而已!
0x00看起来就是8位的.
wesleyluo 2010-04-02
  • 打赏
  • 举报
回复
学习了。
peter_chen_2010 2010-04-02
  • 打赏
  • 举报
回复
估计是为了可读性吧,写成0x00告诉你后面的size是以字节为单位

至少前面说的可移植性,任何平台上0转换成一个字节都还是0x00吧
toborac 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sinosinux 的回复:]
那么,memset(szBuf, 0, sizeof(szBuf)) 在移植时可能出现什么问题? 谢谢
[/Quote]
没任何问题 0就是0 我还习惯写0x0呢
sinosinux 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lovesi3344 的回复:]
可移植性呗

计算机识别二的幂
比如二进制,八进制,十六进制都是二的幂
[/Quote]

那么,memset(szBuf, 0, sizeof(szBuf)) 在移植时可能出现什么问题? 谢谢
lovesi3344 2010-04-02
  • 打赏
  • 举报
回复

可移植性呗

计算机识别二的幂
比如二进制,八进制,十六进制都是二的幂

不知名小ITer 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 sinosinux 的回复:]
我看有些代码中在使用memset时,0都是采用16进制的写法:

C/C++ code

char szBuf[BFSZ + 1];
memset(szBuf, 0x00, sizeof(szBuf));



0x00写成0算了,还少敲几下键盘。写成0x00形式有什么目的吗? 比如可读性,可移植性考虑?

谢谢
[/Quote]
还有一种是

char szBuf[BFSZ + 1];
memset(szBuf, '\0', sizeof(szBuf));//从安全性考虑的...我就遇到过一次这种bug..把我给好找...

你说的应该是移植性了...
加载更多回复(3)

70,024

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧