首页 > 技术文章 > c语言数据类型(一)

long613 2017-10-01 17:46 原文

(强数据类型)

1.常量

  常量是程序中不可变的量

  10为常量

  

  两种常量

  #define 定义宏常量

  const

  

  #对于#define 类型的常量,c语言的习惯是常量名称大写, 对于普通const常量以及变量,一般以小写结合大写的方式

 

#include <stdio.h>

int main() 
{
    printf("%d", 10);
    return 0;
}
#include <stdio.h>

#define MAX 10 //定义一个宏常量 值为10
int main() 
{
    printf("%d", MAX);
    return 0;
}
#include <stdio.h>

#define MAX 10 //定义一个宏常量 值为10
int main() 
{    
    //MAX = 200; //等号左边必须为变量,不能为常量,常量的值不能修改
    printf("%d", MAX);
    return 0;
}
#include <stdio.h>
int main() 
{    
    const int a = 100;
    printf("%d", a);
    return 0;
}

  

  以上为整数常量

  

  字符串 常量

  

#include <stdio.h>
#define STRING "hello world\n";
int main() 
{    
    const char * str = "hello c";
}

 

 

2. 二进制 位 字节 字

  一个位只能表示 0 1 两种状态    bit  1位位1bit

  一个字节为八个二进制  8位   BYTE   8个bit一个字节

  500GB B为BYTE         10Mb bit 

  1个字 2个字节  简称WORD

  2个字为双字      ZWORD

 

  0 八进制 0x 16进制 

 

  

  原码 反码 补码

  整数占 4个字节 以下只写了 1个字节举例子

 

 

   

 

    

 

sizeof 关键字

 

  是c语言关键字,功能是求指定数据类型所占用的字节数。

#include <stdio.h>
int main() 
{    
    printf("%d\n", sizeof(10));
    return 0;
}

 

  32位(bit)操作系统返回的为4     最大的存储的数字   2(32-1) 的数字

 

  size_t 类型 

  

int类型

  int 常量变量

  int 是32位的一个二进制整数,在内存中占据4个字节‘’

   %d  , 输出一个有符号的10进制整数

   %u , 代表输出一个无符号的10进制的整数

 

 

int main() 
{    
    printf("%x\n", 0x10);//输出10
    printf("%x\n", 10);//输出十进制10对应得十六位a
    printf("%x\n", 0xa);//输出a
    return 0;
}

 

 

#include <stdio.h>
int main() 
{    
    printf("%x\n", 0x10);//输出10
    printf("%x\n", 10);//输出十进制10对应得十六位a
    printf("%x\n", 0xa);//输出a
    printf("%x", -7);
    return 0;
}
/*
printf("%x", -7);  输出 fffffff9(这是-7的补码转换为16进制)
源码 10000000 00000000 000000000 00000111
反码 11111111 11111111 111111111 11111000
补码 11111111 11111111 111111111 11111001
*/

/*
-7
1000 0111 用有符号的眼光-7 无符号的眼光135
*/

 

 

 

%x 代表输出十六进制数 (十六进制不表达负数)

%X 用大写字母方式输出16进制数

%o 输出八进制数 (2进制与八进制不表达负数)

 

short、 long 、int 、 long long 、unsigned  、signed(有符号数)

  short 为短整数 在32位操作系统占2个字节

  long 代表长整数, 在32位系统下位4个字节  在64位系统下,windows 4个字节  Unix 为八个字节(不同的操作系统不一样)

  int  (32位系统以上)不论在什么情况下都是4个字节 

  long long 是64位 也就是八个字节的整数  对于32位操作系统cpu寄存器位32位的,计算longlong类型的数据, 效率很低

  unsigned  无符号的数,可以加在任意整数类型后面

 

#include <stdio.h>
int main() 
{    
    int a = 10;//4个字节
    short b = 10;
    printf("%d\n", sizeof(b));//2
    return 0;
}
#include <stdio.h>
int main() 
{    
    int a = 10;//4个字节
    short b = 10;
    long long c = 10;
    printf("%d\n", sizeof(c));//8
    return 0;
}
#include <stdio.h>
int main() 
{    
    int a = 10;//4个字节
    short b = 10;
    long long c = 10;
    unsigned int d = 10;
    printf("%d\n", sizeof(d));//4
    return 0;
}

 

 整数溢出

一个整数计算的时候超过整数能够容纳的最大单位后,整数会溢出,溢出的结果是高位舍弃。

 当一个小的整数复制给大的整数,符号位不会丢失,会集成

    unsigned short abc = 0xffff;
    abc = abc + 1;
    printf("%d\n", abc);//0
    return 0;
  
#include <stdio.h>
int main() 
{    
    int a = 10;//4个字节
    short b = 10;
    long long c = 10;
    unsigned int d = 10;
    printf("%d\n", sizeof(d));//4

    unsigned short abc = 0xffff;
    //abc = abc + 1;
    //printf("%d\n", abc);//0
    
    abc = abc + 100;
    printf("%d\n", abc);//99

    abc = 2;
    abc = abc - 5;
    printf("%u\n", abc);//65533

    int i1 = 0x12345678;
    abc = i1;
    printf("%x\n", abc);//5678 

    short abc1 = -2;
    //1000 0000 0000 0010
    //1111 1111 1111 1101
    //1111 1111 1111 1110(-2)
    //1111 1111 1111 1111 1111 1111 1111 1110
    
    i1 = abc1;
    printf("%x\n", i1);//fffffffe

    unsigned short abc2 = 0;

    abc2 = abc2 - 1;
    //00000000 00000000
    //10000000 00000001
    //11111111 11111110
    //11111111 11111111(65535)
    printf("%d\n", abc2);//65535
    
    //00000000 00000000 00001100
    //10000000 00000000 00000000 00001010
    //11111111 11111111 11111111 11110110
    return 0;

}

 

 

 

 

 

 

 

内存都是以字节为单位的 

1个整数,4个字节

 

大端对齐 与小端对齐

  对于arm,intel 这种x86 构架的复杂指令CPU ,整数在内存是倒着放的,低地址放高位,高地址放低位, 小端对齐

  但对于uniux服务器的CPU,更多的是采用大端对齐的方式存放整数

  

 

 

 

推荐阅读