【C/C++语言入门篇】-- 基本数据类型

来源:互联网 发布:bios多了windows boot 编辑:程序博客网 时间:2024/04/30 01:31

前一篇我们介绍了一个简单不过的helloworld程序引出相关问题。趁着还没有忘掉那些思考方式的记忆,本篇继续延续这种思维方式的理念,介绍一下CC++中的基本数据类型。数据类型不清楚的话在以后的编程中会有很多谜团和问题。甚至一个程序的BUG找半天也没有找出来时为什么,结果才发现是加减溢出了。更加严重的还有写越界、读越界等。同样比如网络传输时的消息结构对待每个字节,每个成员的大小及类型都有很严格的追求。下面我们就逐个进行介绍。

 

首先、我们看32位的整数:int 、unsigned int、long、unsigned long 。这些都是基本类型,没有unsigned关键字的是有符号的,反之是无符号的。还有比如DWORD、 UINT这些也只是写别名(typedef)而已。有符号整数值得注意的是什么范围内是正数,什么范围是负数。这样对于加减运算、比较运算等有很大帮助,否则很容易溢出或者比较错误。举个例子:

 

unsigned int loop = 5; 

for ( ; loop >= 0; --loop )
{
     .......
}

这样一个循环,稍微不注意。就认为它是成立的,其实他是一个死循环。这里会减到0,成立继续减。由于是无符号,将减成最大的32位无符号整数:0xffffffff. 之后继续减,因此为死循环。说到这里,又要提出一个问题了。我们需要记住常用的一些十六进制数,比如:0xffffffff, 0x80000000, 0x7fffffff等。那么:

1. 为什么需要记住这些?这些数有什么特点?在有符号和无符号32位整数里,它们分别代表什么?

 

其次、是16位整数,(short)占2字节。需要注意的跟上面32位整数差不多。

2. 根据第一个问题,大家可以猜猜16位甚至8位有符号、无符号整数需要记住常用的16进制数有哪些?

 

再次、是8位整数,也可以理解成字符。比如char、unsigned char、bool. 这里只描述了基本的类型,其它typedef也是根据这些变了名字而已。在这里需要认识一点,char别始终认为是用在字符上,同样要有观念它是整数,而且是有符号的。大家可以做实验去了解他的范围。在上面的两个问题里,我相信你只要答对了,也就知道他的范围了。这里的bool需要说明,bool只有0或1两个状态,在内存里。因此它的范围只有0~1,嘿嘿!也就是false~true了哟。

 

在我们写程序的时候,脑子里第一反应可以不受数据类型的限制。我们可以首先想到这个类型占用多少个字节,就认为它就是一块儿内存。你可以理解成线段或者进度条的一部分。然后再看这个数据类型(基本数据类型)是否为有符号,然后你在写程序的时候就能有效的控制它的最大数,最小数。从而避免发生溢出等。

 

数据类型,说白了只是语法上的限制。你要是稍微底层一点或者指针操作,那么类型都可以忽略。一切都是在操作内存,即一切都在你的掌控之中。有符号或者无符号只是在比较运算和感官上有正负。在内存中存放的数据是没有符号可言的,你可以这么理解,一个unsigned int 变量的值为0xffffffff,那么同样是0xffffffff表示为int类型,它就等于-1。而在内存中都是同样的存储方式。所以,首先我们得跨过数据类型给我们带来的某些迷惑。不要让它限制了我们的思维。我们不能坐井底观蓝天以为自己在世外桃源,而不知自己却身处荒漠。我们得跳出去看世界。

 

本来想提个问题让大家去看看每种数据类型在内存中是这么存放的,在内存中观察我们的变量占用的字节数及所在位置(内存地址)的。但是可能有的朋友对VC(我是用的VC2005)不是很熟。内存窗口在哪儿也不知道。那么这个问题就留给知道的人去摸索吧,至于不知道的朋友,我会在以后专门讲调试技巧的时候讲VC的一些常用于调试时观察的窗口。

 

好了,继续我们的探索。下面一个数据类型是64位整数,C99 为 C 语言扩展了新的整数类型 long long ,通常被定义成 64 位宽。但是 C 标准并没有定义具体的整数类型的宽度,只定义了 long long 的级别高于 long, long 的级别高于int, int 的级别高于 short ,short 的级别高于 char 。级别高的整数类型的宽度大于等于级别较低的整数类型。占用字节数位8字节,同样需要注意的也在上面提出了。另外根据这些需要记住的16进制数,大家可以对内存有个比以前更直观的理解了。16禁止数每一位表示4位,2位表示一个字节。比如:0xff就表示一个字节(这里只是纯观察哈)了。0xf就表示字节的低4位全是1,在二进制上为: 0000 1111。够直观吧? - -

 

再者就是浮点数,有32位和64位。浮点数在内存中看是看不出是否为浮点数的,因为跟整数的存法没有上面区别。但程序是怎么知道那是浮点数的呢?呵呵,浮点数在存放进内存的时候是通过换算之后才存入内存的,以后我们单独列出来讲浮点数的存储。大家也可以去搜索一些先了解下。另外,很多黑客也喜欢记住一些特殊的浮点数换算后存放在内存中的16进制数。对他们逆向及分析一些病毒等有很大帮助。

 

还有就是void类型,大家可能最初认识void的时候是写函数的时候,比如 void function()表示没有返回值。以后在指针那节时会讲到void类型的指针。这里先做个了解。

 

另外其它的数据类型比如,结构体类型、枚举类型、联合等这些非基本数据类型将在后面逐个介绍。还有将小类型数据合并成大数据,合并小类型数据进行一次性赋值写入或者读取,我们将在位运算和指针章节讲解。

 

最后,大家可以用sizeof分别求求这些基本类型所占用的字节数。记得这些数据类型的大小对大家很有帮助。比如以后的结构体对其问题,还有位域的使用等。以后逐一介绍。

 

问题:

3. 研究下这些基本类型如果用printf输出,在格式化字符串的时候应该怎么写?比如:

    int a = 100;

    printf( "%d", a );  int类型使用的是%d,那么其它的呢? 还有输出16进制数占8字符宽度带0x前缀的呢? 

 

4. 怎么判断一个无符号32位整数是否加运算溢出呢?比如:

   unsigned int count = 0x80000000;

   count += count;

   判断count是否会加法溢出,不会溢出才执行:count += count;

 

【C/C++入门篇系列】

【C/C++语言入门篇】-- 序言

【C/C++语言入门篇】-- HelloWorld思考

【C/C++语言入门篇】-- 基本数据类型

【C/C++语言入门篇】-- 调试基础

【C/C++语言入门篇】-- 深入指针

【C/C++语言入门篇】-- 数组与指针

【C/C++语言入门篇】-- 结构体

【C/C++语言入门篇】-- 深入函数

【C/C++语言入门篇】-- 位运算

【C/C++语言入门篇】-- 剖析浮点数

【C/C++语言入门篇】-- 文件操作

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 染头发新长出来怎么办 白色衣服弄上口红怎么办 口红弄到牛仔裤上怎么办 口红弄到沙发上怎么办 做了拔罐后背疼怎么办 拔罐拔出血水后怎么办 拨了罐浑身疼怎么办 拔完火罐洗澡疼怎么办 拔罐之后脊背疼怎么办? 五个月的狗胆小怎么办 电脑颜色不正常分辨率调不了怎么办 宝宝认人怎么办 五个月 新生儿42天听力筛查未通过怎么办 幼儿大便干燥拉不下粑粑怎么办 宝宝大便干燥拉粑粑带浓血怎么办 新生儿便秘4天了怎么办 写卷子的题目不认识怎么办? 2个月小猫尿床怎么办 安全教案鱼刺卡住了怎么办 被鱼刺卡住怎么办安全教案 小班健康教案生病了怎么办 被蜜蜂蛰了怎么办教案 走丢了怎么办大班反思 小孩吃了硬物怎么办 小孩吞了硬物怎么办 小学二年级孩子成绩不好怎么办 二年级孩子成绩不好怎么办 一年级学的不好二年级怎么办 17个月宝宝夜奶怎么办 小孩吃积食了吐怎么办 11个宝宝不会爬怎么办 5岁宝宝严重挑食怎么办 孩子吃菜口味重怎么办? 孩子挑食不吃菜不吃肉怎么办 微信新的朋友回复频繁怎么办 忘了闺蜜生日怎么办 把闺蜜生日忘了怎么办 忘了闺蜜的生日怎么办 一岁宝宝不吃菜怎么办 幼儿园教案虫子爬进耳朵怎么办 鼻子出血怎么办幼儿说课