#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
char a = 3;//写上char的一瞬间,机器默认就发生整型提升了<第一次整型提升>
char b = 127;//写上char的一瞬间,机器默认就发生整型提升了<第一次整型提升>
printf("%d\n", a + b);//这时还是int型的
char c = a + b;//这时发生<第二次整型提升>
printf("%d", c);
}
【整型提升】
实质原因是在计算机中,进行运算的器件ALU一般是int型的,所以要运算就要求操作数是int型
char a 当写上char 就相当于开辟了一个char型的空间,与此同时赋值的内容3,也会机器默认转换成int型的,方便之后你做什么用
这是<第一次整型提升>
随后你运算他们,结果还是int型的
直到这个int型的结果,又赋值给char型
这时发生<第二次整型提升>
整型提升发生在char和short int型,包含有符号无符号,要运算必须得够int这32个bit位,char是1字节8bit,short是2字节16bit
这些输入char,赋值给char无形中机器默认就发生整型提升的事,叫[隐式类型转换]
但是结果为什么是-126?
//-------------------------------------------------------
分析能输出哪个结果?
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
char a = 0xb6;//十六进制b6=二进制1011 0110
short b = 0xb600;//十六进制b600=二进制10110110 00000000
int c = 0xb6000000;//十六进制b6000000=二进制//10110110 00000000 00000000 00000000
if (a == 0xb6)
printf("a");
if (b == 0xb600)
printf("b");
if (c == 0xb6000000)
printf("c");
}
//0xb6=00000000 00000000 00000000 1011 0110
//char a实际只能接收到后8位,是1011 0110,所以if a错
//0xb600=00000000 00000000 10110110 00000000
//short a实际只能接收到后16位,是10110110 00000000,所以if b也错
//0xb6000000=10110110 00000000 00000000 00000000
//int c实际接收到是10110110 00000000 00000000 00000000,是这个32位的数,c正确
//0xb6=00000000 00000000 00000000 1011 0110
//char a实际只能接收到后8位,是1011 0110,所以if a错
//0xb600=00000000 00000000 10110110 00000000
//short a实际只能接收到后16位,是10110110 00000000,所以if b也错
//0xb6000000=10110110 00000000 00000000 00000000
//int c实际接收到是10110110 00000000 00000000 00000000,是这个32位的数,c正确
//---------------------------------------------------------
看这个,输出结果为什么是141
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(!c));
}
%u 是以十进制数,输出unsigned型数据
1、c=1 c是char型 chai是1字节 所以是1;
2、c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节.
表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof© ,就是1个字节.
3、!c是取反,不属于运算