很久以前的笔记,如果学的比较透了再来补充
数据类型 | 字节数 |
---|---|
char | 1 |
short | 2 |
int | 4 |
long | 8 |
long long | 8 |
float | 4 |
double | 8 |
char虽然是字符类型,但是字符存储的时候, 存的是字符的ascii码值,是整数,所以char也是整形家族的
cpu只有加法器
一、整形提升
C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的char和short型操作数在使用之前被转换为int,这种转换称为整型 提升。
整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度 一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。
整型提升的例子:
//例一
#include<stdio.h>
int main()
{
//首先把整型数据赋值给char型变量,会发生操作数截断
//而当有操作符作用在数据上时,数据又会整型提升
char a = 3;
//00000000 00000000 00000000 00000011 —— 原码、反码、补码
//00000011 —— 截断之后的储存存值 —— 补码
char b = 127;
//00000000 00000000 00000000 01111111 —— 原码、反码、补码
//01111111 —— 截断
char c = a + b;
//00000000000000000000000000000011 —— a整型提升之后 —— 可进行运算
//00000000000000000000000001111111 —— b整型提升之后
//00000000000000000000000010000010 —— 运算之后
//10000010 —— 截断之后
//11111111111111111111111110000010 —— 整型提升 —— 补码
//11111111111111111111111110000001 —— 反码
//10000000000000000000000001111110 —— 原码 —— -126
printf("%d\n", c); //打印值为-126
return 0;
}
//例二
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if(a==0xb6)
printf("a");
if(b==0xb600)
printf("b");
if(c==0xb6000000)
printf("c");
return 0;
}
答案为:c
解析:
变量a为字符类型 —— 需要进行整型提升 —— a为10110110 —— 最高位为符号位(1)
—— 整型提升之后 —— 11111111111111111111111110110110 —— 整型提升之后不等于原值
变量b同理 —— 整型提升之后不等于原值
变量c为整型 —— 不需要进行整型提升 —— 等于原值。
//例三
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}
答案为:1 4 4
分析:
第一个:c为char类型的变量,所以大小为1个字节
第二个:+ 为运算操作符 —— 如果运算就需要进行整型提升 —— 整型提升到int类型 —— 大小为4字节
第三个;和第二个同理
二、算术转换
整型提升是int类型大小以下以及int类型运算类型的转换
算数转换是int类型大小以上的运算的转换
即向上转换
三、浮点数在内存中的存储
32位浮点数和64位浮点数在内存中存储的格式:
S:符号位。0表示为正数,1表示为负数
E:阶码。它的值等于浮点数的指数e加上一个修正数(127(32位下)/1023(64位下)
M:尾数。
在IEEE754标准中,一个规格化的32位浮点数x的真值表示为:
x = ( − 1 ) S ∗ ( 1. M ) ∗ 2 E , E = e + 127 x = (-1)^S*(1.M)*2^E, E = e+127 x=(−1)S∗(1.M)∗2E,E=e+127