第二章: 基本数据类型
Posted 歌咏^0^
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二章: 基本数据类型相关的知识,希望对你有一定的参考价值。
目录
1、概念:
数据类型 其实 是 固定大小内存的别名。其实是描述了一个 变量 存放什么类型的数据。
2、数据类型的分类
基本数据类型 : int double float char short long long long
复合数据类型 : 数组、结构体、枚举
3、基本数据类型在内存中所占的字节数
int (整型) | 4 |
double(双精度浮点型 ) | 8 |
float (单精度浮点型) | 4 |
char (单个字符 'a' 'b') | 1 |
short int (短整型) | 2 |
long (long int)长整型 | 4(32位系统) 8(64位系统) |
long long (long long int)(长长整型) | 8 |
bool _Bool (布尔类型 真 ture 假 false ) | 1 |
注意:
printf("true size:%d\\n",sizeof(true)) 占 4个字节
printf("false size:%d\\n",sizeof(false)) 占 4个字节
计算某个数据类型所占的字节数 ----》sizeof( 某个数据类型)
sizeof(int)
总结:
1)数据类型在内存中所占的字节数 跟 C语言的 编译系统有关
2)计算 某个数据类型 所占的字节数 可以用sizeof
3) 布尔类型 要添加 #include<stdbool.h>
字节(byte B):计算 存储容量的一种单位。
比特位(bit):二进制数 0 1
1个字节 = 8位 二进制
1个千字节(KB) = 1024字节
1M = 1024KB
1G = 1024M
1T = 1024G
4、有符号数 和 无符号数
有符号数 (signed ) char a = -100 char a = 100; -->存储到内存中,最高位 表示符号位 1表示负数 0表示正数,不参与运算
无符号数 unsigned char a = 100;
bit7 bit0
1110 0100 0110 0100
5、数据类型的值域范围
unsigned char 0 ~ 255
signed char -128 ~+127
正数: +0 +1 ....+127
负数: -0(-128)-127 .....-1
由于 +0 和 -0 重复了, -0 表示 -128
unsigned short 0~65535
unsigned int 0 ~ 4294967295
溢出:对于某一种特定整数类型都有自己的范围,超出这个范围之外,都称之为 溢出。
---汽车的里程表
unsigned char a = 257;
char b = 129
printf("a:%hhu\\n",a); //a == 1 //%u --->unsigned int %hu half int %hhu half half int
printf("b:%hhd\\n",b); //b==-127
-----------------------------------------
#include<stdio.h>
#include<stdbool.h>
int main()
{
unsigned char a = 257;
char b = 129;
printf 函数 是 将指定格式的数据输出到屏幕终端
printf("a:%u\\n",a); //a == 1
printf("b:%d\\n",b); //b:-127
return 0;
}
---------------------------------------------
6、整型数据(进制)
十进制: 1 3 100 %d %u
八进制: 以0开头的 0664 0777 %o
十六进制:以0x开头的 0-F 0xff 0x1a 0x3d %x
unsigned int a = 255;
printf("a:%d\\n",a);
printf("a:%#o\\n",a);
printf("a:%#x\\n",a);
进制之间的转换:
十进制-----》二进制
十进制-----》八进制
十进制----》十六进制
二进制-----》十进制
八进制-----》十进制
十六进制----》十进制
7、整型数据在内存中的存储方式
1)整型数据(正数 、负数)在内存中是以二进制补码的方式存放的
2)无符号数的原码反码补码都是一样的,不需要改变
3)有符号数的最高位为符号位,1表示负数,0表示正数,其它位是数值位
负数:
原码:原始数据
反码:原始数据 取反
补码:反码 +1
"补码"
正数:
原码(直接转化为二进制)
负数:
绝对值的原码取反加1
(1)当编译器以整型输出时(%d),是以补码还原的方式来解读的。
(2)当CPU把数据进行运算时,直接以内存中存放的形式进行运算,即补码的形式
重难点:8、C语言各整型之间的赋值问题(有符号和无符号的本质区别)
当CPU把数据进行计算时,需要把变量的数据拷贝到CPU内部的寄存器(32bits),当变量的数 据小于32bit位时,有符号的数据拷贝到寄存器的高位补符号位,无符号的数据拷贝到寄存器高位补0。
1) %u 打印的时候, 值域的范围: unsigned int 0-4294967295
2) %hhu 打印的时候, 值域的范围: unsigned char 0-255
(1)unsigned char a = 255; // 0 - 255
char b = 255; // -128 ~ +127
printf("%d %u\\n",a,a); // 255 255 第一个a为255的原因:a为无符号,%d的范围:
-2^31 ~ 2^31 -1
printf("%d %u\\n",b,b); // -1 4294967295
(2)unsigned short a = -1; // 0-65535
int b = a; //65535
printf("%d\\n",b);// 65535
(3)unsigned char a = -1; //0-255 a--->255
unsigned int b = -1; // 0- 4294967295
printf("%d %u\\n",a,b); //a == 255 b == 4294967295
处理整型(char short int)时,都会自动提升为int(如果int范围不够,则提升成 unsigned int)。
比如 “a == 0xb6”,首先0xb6会当一个int来处理,变为0x000000b6。 a 会提升为int ,假如 char 被定义为有符号的,那么 a 为负数,因为最高位为1,所以 a会提升为 0xffffffb6。假如 char 被定义为无符号的,那么a会提升为 0x000000b6 。
vc编译器、x86上的 gcc 都把 char 定义为 signed char;而 arm-linux-gcc 却把 char 定义为 unsigned char 。这样一来,在代码移植上就会出现问题。举个最简单的例子:
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if ( a == 0xb6) puts("a");
if ( b == 0xb600) puts("b");
if ( c == 0xb6000000) puts("c");
在vc 或 x86的gcc 上,只会打印出 c 。用 arm-linux-gcc 编译,在arm板上,是可以打印出 a 和 c 。
9、char类型数据 ---->单个字符数据 'a'
字符和整数没有本质的区别。可以给 char变量一个字符,也可以给它一个整数;反过来,可以给 int变量一个整数,也可以给它一个字符,ASCII 码表将整数和字符关联起来了。
既然char的本质是整数,那C语言中为什么还需要char类型呢?
因为字符的个数不多,而char型变量占用的存储空间比int型变量小,所以用char型变量表示字符,为编程带来了方便。
char value1 = 'a';
char value2 = 'b';
10、转义字符
所有的ASCII码都可以用“\\”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加"\\"来表示常见的那些不能显示的ASCII字符,如\\0,\\t,\\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。它告诉编译器需要用特殊的方式进行处理。
'\\ddd' ddd表示1到3位八进制数,打印效果为该数字对应的ASCII字符,如: '\\34'==>'('
'\\xhh' hh表示1到2位十六进制数,打印效果为该数字对应的ASCII字符,如: '\\x22' ==>'"'
'\\n' 换行
'\\t' 横向跳格(Tab)
'\\r' 回车,返回行首
'\\\\' 反斜杠
'%%' %
\\b 退格符 /b的含义是,将光标从当前位置向前(左)移动一个字符(遇到\\n或\\r则停止移动),并从此位置开始输出后面的字符(空字符\\0和换行符\\n除外)。
"a" 'a' '\\t' '\\n' '\\033' '\\0x10'
'\\41' -->八进制 相当于 '\\041'
----------------------------------
#include<stdio.h>
#include<stdbool.h>
int main()
{
char value = '\\x21'; // \\
printf("value:%c\\n",value); //value : !
printf("value:%hhd\\n",value); //value : 33
return 0;
}
----------------------------------------
11、ascii 码
char类型数据存储 都是 以ascii 码 形式
如何查看 ascii 码??
man ascii
12、隐式类型转换
void foo(void)
{
unsigned int a = 6;
int b = -20;
if((a+b)>6) // 6 + -20 == -14
printf(">6\\n");
else
printf("<6\\n");
printf("%u\\n",(a+b)); //4294967282
}
总结: 一个有符号数 和 无符号数 相加,最后转成 无符号数
以上是关于第二章: 基本数据类型的主要内容,如果未能解决你的问题,请参考以下文章