科研办主任篇——重温C语言(1) 位、字节、字;我们要用windows api

来源:互联网 发布:ipv4无网络访问权限 编辑:程序博客网 时间:2024/05/20 18:46

2016年,我有幸成为山东大学威海校区2016级新生的科研办主任,这一定会是一段美好的回忆,也一定是值得我品味一生的经历。

给新人入门总是最难的,而我真真切切感受到了这一真理。有心改变国内教育高大上(假大空)和极其抽象的弊病,终于发现本科老师的难处:想要讲实际点的东西,一点基础没有根本进行不下去;讲完基础再讲实际的深层次的内涵,课时量就那么多,怎么讲得过来?

限于我的教学0经验(倒是干过私人家教,但是与集体教学完全不一样),我尝试利用qq这一平台通过视频进行教学,并把教学视频录制了下来(将传到我的个人网站),但是初次感觉并不像预期的那么理想,控场能力还有待提升啊。

10月3号晚上,进行了c语言教学的第一节课,从新建工程开始,讲怎么设断点,监视变量,单步调试等等,讲什么是数据类型,讲最基本的数据类型。但是发现同学们大部分完全没有接触过类似内容,很大一片都有了畏难情绪,,,这就很蛋疼了(不过还是有不少愈挫愈勇的孩纸,坚持)。所以课程到后来基本就成了“这就是格式,初学的时候先别太纠结为什么,咱们先继续往下进行,暂时记住这个格式就好了。哪里想知道的私聊。”
我也知道这话有敷衍成分,但是不这样根本进行不动。好在同时录了视频,哪里不懂的重播视频应该能好一些,至于想求根问底私聊的,连5个都不到。真是,,浓浓的挫败感啊。。。

不好,吐槽吐多了。今天的正题好像是说位、字节、字的相关内容。

很多中文资料都有提到位、字节、字的知识点。但是不得不说,都写得很烂。英文的资料倒是挺详细的,从8位机,16位机,32位机,64位机一步步讲过来,讲c语言历史,讲windows api的好处。不过,我想,看我这篇blog的人估计没多少是愿意耐下心来仔仔细细看英文资料的吧。虽然这样,但我仍希望您能够适应英文的文献,论坛(我最受不了的就是英文论坛,扯来扯去就看晕了)。

在昨晚讲课过程中,对int取值范围这个地方卡住了。今天仔细查了一些资料,终于差不多弄清了这个地方。
以下是正文内容……前言有点多了。。。

还记得昨天晚上开播讲课的时候有些地方拿不准,今天我查了一下,在此给出明确答案:

1、 在C/C++中int的范围究竟是多大。
2、 位、字节、字、32bit/64bit

欲要解决这两个问题,首先要明确第二个,即位、字节、字的关系。

一个字节(byte)是8位,也叫8比特(bit,音译过来的)
计算机进行数据处理时,一次存取、加工和传送的数据长度称为字(word)。
C语言中似乎没有强调机型位数的差别,而windows的API有较好的显示,https://msdn.microsoft.com/en-us/library/aa383751(VS.85).aspx
“字”概念的提出是在16位机型的时候,因此字就是unsigned short,范围是0-65535(2^16-1)。为了程序兼容性之类的原因,windows并未在出现32位机与64位机之后改WORD的范围,而是增加了DWORD以支持32位机,范围是0-4294967295(2^32-1)。已经够大了吧!如果你的应用还需要更大的数,windows api还提供了UINT64,范围是0-18446744073709551615(2^64-1),足足有20位数字。。。

发现扯远了,回到我们初学常用的int上面。
现在大家的机型基本都是64位机了(科技发展好快,电脑的位数一般只考虑cpu,不清楚的同学上网查一下cpu型号,看看是不是64位的),int在初学的应用中默认是4个字节即32位的数,它与上面的DWORD的区别是:int有符号。因此其范围是-2147483648到2147483647(-2^31到2^31-1,至于为什么,这里牵扯到反码,补码一系列知识,《编码——隐藏在计算机软硬件背后的语言》一书讲得很好)

这里我提供了一个小程序来验证我的这番言论:
int t = 2147483647; // 2^31-1
unsigned int u = 4294967295; // 2^32-1

// 以下是windows api,需要windows.h头文件DWORD d = 4294967295; // 2^32-1WORD w = 65535; // 2^16-1UINT64 u64 = 18446744073709551615; // 2^64 -1

大家可以改改数字大小,加一减一的试验一下。

但是,当大家脱离菜鸟阶段,尽量减少诸如int、long之类的使用。如果写windows程序就是用windows api(如WORD、DWORD、UINT32、UINT64、INT32、INT64等),写linux就参考linux api。
最后吐槽一句:LONG64、LONG32这种跟INT64、INT32毫无区别啊,为毛整出那么多来看着眼晕。。。

Reference:
http://stackoverflow.com/questions/7750140/whats-the-difference-between-a-word-and-byte
http://stackoverflow.com/questions/2995251/why-in-c-do-we-use-dword-rather-than-unsigned-int

http://www.cnblogs.com/augellis/archive/2009/09/29/1576501.html
http://bbs.csdn.net/topics/10180696

1 0
原创粉丝点击