C语言数据类型和运算符

运算符

二进制、八进制和十六进制

二进制数、位、字节与字

一个位只能表示0或者1两种状态,简称bit,一个位就是一个bit
一个字节为8个二进制,称为8位,简称BYTE,8个比特是一个字节

一个字为2个字节,简称WORD
两个字为双字,简称DWORD

八进制

8进制为以8为基数的数制系统,C语言当中0表示八进制,如0100(10进制为64)

#include <stdio.h>

int main()
{
    printf("%d\n",0100);//output 64
    printf("%d\n",100);//output 100
    printf("%d\n",0x10);//output 16
    printf("%u\n",-10);//无符号输出
    printf("%x\n",-10);//十六进制输出
    return 0;
}

十六进制

十六进制以16为基数的数制系统,C语言中用0x表示十六进制

十进制十六进制二进制八进制
0000000
1100011
2200102
3300113
4401004
5501015
6601116
7701117
88100010
99100111
10a101012
11b101113
12c110014
13d110115
14e111016
15f111117
16101000020
17111000121

进制之间的转化

参考链接:http://www.cnblogs.com/gaizai/p/4233780.html#_labelConvert42

原码

将最高位作为符号位(0代表正,1代表负),其余各位代表数值本身的绝对值

+7 的原码是  0000 0111
-7 的原码是  1000 0111
+0 的原码是  0000 0000
-0 的原码是  1000 0000

反码

一个数如果值为正,那么反码和原码相同
一个数如果值为负,那么符号位为1,其他位与原码相反

+7 的反码是     0000 0111
-7 的反码是  1111 1000
-0 的反码是  1111 1111   

补码

原码和反码不利于计算机的运算,如原码表示的7和-7想加,还需要判断符号位。
正数:原码、反码、补码都相同
负数:最高位为1,其余位为原码取反,最后对整个数+1

补码符号位不动,其他位求反,最后整个数加1,得到原码

求-7的补码
1000 0111(原码)
1111 1000(反码)
1111 1001(补码)

参考链接:https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

siezof关键字

sizeof是C语言的关键字,功能是求指定数据类型在内存中的大小,单位为:字节

C语言数据类型

int类型

int 就是32位的一个二进制整数,在内存中占据4个字节的空间。int不管是32位系统还是64位系统,不管是windows还是unix都是占用4个字节

short

代表短整数,在32位系统下,是占用两个字节,16个比特

long

long代表是长整数,在32位系统下,long都是4个字节的;在64位系统下,windows还是占用4个字节,unix下成了8个字节

long long

long long是占用64位,也就是8个字节大小的整数,对于32位系统,CPU寄存器是32位,所以计算long long类型的数据,效率很低

整数溢出

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

当一个小字节的整数赋值给大字节的整数,符号位不会丢失,会继承

#include <stdio.h>

int main()
{
    short abc;
    int i = 0x12345678;
    abc = i;
    printf("%x\n",abc);
    short b = -2;
    i = b;
    printf("%x\n",i);
    unsigned short c = 0;
    c = c - 1;
    printf("%d\n",c);
    return 0;
}

大端对齐与小端对齐

这里写图片描述
对于arm、intel这种X86架构的复杂指令CPU,整数在内存中是倒着放的,低地址放地位,高地址放高位,小端对齐。
但对于Unix服务器的CPU,更多的是才用大端对齐的方式存放整数

char类型

char的本质就是一个整数,一个只有一个字节的整数

char 取值范围位-128到127
unsigned char 为0-255

浮点float、double、long double类型

浮点数的效率是很低的,如果只是整数运算,那么就避免使用浮点数
float 在32位系统上是占用4个字节,在64位是占用8个字节

类型限定

  • const

  • volatile

代表变量是一个可能被CPU指令外的其他设备改变的,编译器就不会针对这个变量去优化目标代码

#include <stdio.h>

int main()
{
    //告诉编译器,不要针对这个变量优化代码
    volatile int i = 100;
    i = i +5;
    //外部设备量改变了 i 的值
    i = i +10;
    i = i + 30;
    // i = i + 45;//如果不声明的话,会被编译器优化成这样
    printf("%d\n",i);
    return 0;
}
  • register

声明变量 是在CPU寄存器里面,而不是在内存里。但是register是建议型的指令,而不是命令型的指令

字符串在计算机内部的存储方式

字符串是内存中一段连续的char空间,以‘\0’结尾

printf关键字

%d  输出10进制整数
%x  输出16进制小写
%X  输出16进制大写
%u  输出无符号10进制整数
%o  输出8进制整数
%p  显示内存的地址
%f  输出浮点数

scanf

通过键盘读取用户输入

#include <stdio.h>
int main()
{
   int a= 0;
   int b = 0;
   scanf("%d",&a);//一定要用&取变量的地址
   scanf("%d",&b);//一定要用&取变量的地址
   printf("a + b = %d\n",a+b);
   return 0;
}

类型转化

#include <stdio.h>

int main()
{
   // double f = 3/2;//C语言中两个整数相除的结果自动转为整数
    double f= (double)3/2;
    printf("%f\n",f);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值