第二章: 基本数据类型

Posted 歌咏^0^

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二章: 基本数据类型相关的知识,希望对你有一定的参考价值。

目录

1、概念:

2、数据类型的分类

3、基本数据类型在内存中所占的字节数

4、有符号数   和 无符号数

5、数据类型的值域范围

6、整型数据(进制)

7、整型数据在内存中的存储方式

8、C语言各整型之间的赋值问题(有符号和无符号的本质区别)

9、char类型数据 ---->单个字符数据  'a'

10、转义字符

11、ascii 码

12、隐式类型转换


    

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 
}


   总结: 一个有符号数  和  无符号数 相加,最后转成  无符号数

以上是关于第二章: 基本数据类型的主要内容,如果未能解决你的问题,请参考以下文章

第二章 数据类型运算符和表达式

第二章

Python开发第二篇:Python基本数据类型

Python 第二课,运算符和基本数据类型

C++ Primer 学习笔记——第二章

Python开发第二篇:Python基本数据类型