Lesson10 PoEdu培训第二课 C语言篇(2) 整数类型
文章类别: 培训笔记 0 评论

Lesson10 PoEdu培训第二课 C语言篇(2) 整数类型

文章类别: 培训笔记 0 评论

数据类型

思维导图

Alt 思维导图

温故而知新

复习

我们知道, 计算机中, 最小的存储单位是 位(bit)
而CPU在操作数据的时候, 会使用到内存中的8个数据引脚, 我们将这么大的数据量成为 1字节(byte)
即 1 byte == 8 bit

变量, 常量

一个程序是由算法和数据构成的.

在一个程序中, 用来表示数据的, 我们称之为变量常量
变量, 是指能变化的值.
常量, 是表示不会被改变的值.

存储单位

经过我们计算机的高速发展, 我们的字节(byte)已经不够用了.
于是, 我们出现了字(word)双字(dword).
1 word == 4 byte
1 dword == 2 word
1 dword == 32 bit
现在, 双字(dword)已经成为我们计算机最常用的单位.

整数类型

int
short
long 
longlong
unsigned 

我们的整数, 使用双字(DWORD)来存储, 所以一般的, 我们的整数占用32位(bit).

类型大小

short <= int <= long
longlong
C语言标准中, 并没有明确规定数据类型的大小, 这些都是约定俗成的.
int         32bit       (Windows下)
short       16bit
long        32bit       (Windows下, 有些系统不同.)
longlong    64bit       
unsigned    *           无符号位, 全部用来表示数值, 需配合上边的4个类型使用.

Alt 无符号数

内存分配和存储

每一个变量其实都是一个代号, 代表的是内存地址的编号和所占内存空间大小的综合体.

无论我们定义的变量是 int 还是 unsigned int, 在内存中的存储内容都是一样的.
比如我们如下代码:

/*************************************************************************
   > 文件名: lesson10.node01.c
   > 作者: 花心胡萝卜
   > 邮箱: hxhlb@hxcarrot.com
   > 创建时间: 2016-09-09 22:28:44
************************************************************************/

#include <stdio.h>

int main() {
    unsigned int uiValue = 0xFFFFFFFF;
    int iValue = 0xFFFFFFFF;

    printf("uiValue:%u\n", uiValue);
    printf("iValue:%d\n", iValue);

    printf("uiValue 使用 %%d: %d\n", uiValue);
    printf("iValue 使用 %%u: %u\n", iValue);

    iValue += 1;
    uiValue += 1;
    printf("iValue + 1 使用 %%d 和 %%u: %d, %u\n", iValue, iValue);
    printf("uiValue + 1 使用 %%d 和 %%u: %d, %u\n", uiValue, uiValue);

    return 0;
}

我们的运行截图如下:
Alt 运行截图
可以看到, 我们最终输出的值, 和我们使用什么样的解析(转换)方式有关, 而在内存中, 它都是一样的.
不同的解析方式, 会导致不同的表现结果. (0xFFFFFFFF+1)试一下
我们必须选择正确的 转换控制符 才能正确的获取结果.

从本质看问题

根据上面的例子, 我们可以发现, 仅针对整数类型而言, 我们在内存中存储的内容是一样的.  
我们利用 unsigned int 类型的最大数值 0xFFFFFFFF + 1, 在内存中, 所有的位都会变成0.    
而运行结果也显而易见的证明了我们的计算.  

所以我们得出结论:
我们只要确定, 我们内存中的数值是正确的, 就可以了.
我们使用不同的解析方式, 就会产生不同的表现结果.
我们必须选择正确的 转换控制符 才能正确的获取结果.

作业

1. 使用正确的占位符打印出 int, long, longlong 的最大值和最小值.(有符号)
2. 请写出一个16进制数的溢出有符号和无符号的long型.
3. -12345在无符号 int 中值为多少?

如有错误,请提出指正!谢谢.

回复