数据的存储方式

1、进制转换
计算机中的进制有二进制、八进制、十进制、十六进制,十进制是逢十进一,八进制逢八进一,以此类推,x进制逢x进1。

二进制、八进制、十六进制转十进制规律是相同的,都是按权求和
(10010)2 = (1 * 2^4 + 0 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0)10
(234)8 = (2 * 8^2 + 3 * 8^1 + 4 * 8^0)8
(1a2) = (1 * 16^2 + a * 10^1 + 2 * 16^0)16

十进制转二进制:
(103)10 ->(01100111)2->(147)8->(67)16
128 64 32 16 8 4 2 1
0 1 1 0 0 1 1 1
每三位二进制就是一位八进制
001 100 111
1 4 7
每四位二进制就是一位十六进制
0110 0111
6 7

2、C语言中的数据类型
signed:有符号类型
char 1byte
short 2byte
int 4byte
long iny 4byte
long long 8byte
unsigned:无符号
unsigned char 1byte
unsigned short 2byte
unsigned int 4byte
unsigned long int 4byte
unsigned long long 8byte
浮点数:
float: 4byte
double 8byte
long double 8byte,12byte,16byte
布尔类型
bool 1byte
空类型
void(不能定义变量,可以定义指针)

计算机中数据的存储方式
以二进制进行存储
一、计算机存储整型数据:
计算机存储整型数据是以补码存储
计算机按照补码计算
原码:就是二进制定点表示法,即最高位为符号位,“0”表示正 “1”表示负,其余位表示数值的大小。
正数的原码 =》反码=》补码

负数的原码 -> 符号位不变按位取反变成反码->在加1变为补码。
补码变原码->符号位不变按位取反在加1
例如:n = 8 1+7 按照8个二进制位存储
求补码:
5 : 0000 0101(原码、反码、补码相同)
第一种方法:-5:2^8 - 5
10000 0000
0000 0101
1111 1011 (补码)
第二种:-5: 1000 0101 原码
1111 1010 反码(加1 )
1111 1011 补码
2、 n = 16 1+15 按照16个二进制位存储
5: 0000 0000 0000 0101
-5 : 2^16 - 5
1 0000 0000 0000 0000

​ 0000 0000 0000 0101

​ 1111 1111 1111 1011 (补码)

3、数据的表示范围
用char类型进行举例说明

int main()
{
   
	for(char a = 0;a < 128;++a)
	{
   
		printf("%5d",a);
	}
}

在这里插入图片描述
char 1字节8个二进制位 -128~-1 0~127
(127) 0111 1111 + 1 = 1000 0000(-128) 1为符号位,为-128
unsigned char : 0 ~ 255
为什么会用补码存储整型数据呢?
cpu只有加法,取反,左移,右移,减法可以用加法替换,使用补码来做加法运算,将使计算机的基础硬件单元加法器的设计大大简化,提高了计算机的整体性能。
4、扩充和截取
扩充:有符号数

char a = 5;
short x = (short)a;
short x = a;

char a : 0000 0101
有符号扩充符号位 ,short是两字节因此要扩充 0000 0000 0000 0101

char a = -5;
short x= (short)a;
short x= a;

-5: 1111 1011
扩充:1111 1111 1111 1011
无符号扩充:扩充0

unsigned char a = 5short x = (short)a;
short x = a;

5 : 0000 0101
扩充:0000 0000 0000 0101

截取:

int x = 0x123456A8
short a = x;
char a = x;

高地址 ——> 低地址
0x123456A8
x : 0001 0010 0011 0100 0101 0110 1010 1000
short a : 0101 0110 1010 1000
char a : 1010 1000
5、类型转换
算数类型转换和赋值类型转换
1、类型相容:类型不同但系统可以自动进行转换
但是只针对于基本数据类型,指针、数组、结构体类型、联合体、枚举类型不具有此性质。
数据类型转换:隐式类型转换、显示类型转换
2、隐式类型转换规则:
两个操作数之一是double?->另一个也转换成double,
同理由高到低如下:unsigned long long -> long long ->unsigned int ->int ->当操作数为char / short 时,则转换为int.

int main()
{
   
	char a = -5;               1000 0101
	unsigned int b = 10;       1111 1010
	if(a > b)                  1111 1011    
	{
   
		printf("%d > %d \n",a,b);//  -5 > 10
		printf("%u > %u \n",a,b);
	}
  	else                                        
	{
   
		printf("%d < %d \n",a,b);
	}
	return 0;
}

char类型a要转换成unsigned int a要进行扩充成四个字节
有符号扩充符号位 所以 a: 1111 1111 1111 1111 1111 1111 1111 1011 然后我们会把他识别成一个无符号整型
在这里插入图片描述

int main(
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值