常用基本数据类型:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(){
printf("基本数据类型:\n");
printf("char: %d\n", sizeof(char));
printf("int: %d\n", sizeof(int));
printf("double: %d\n", sizeof(double));
}
size的单位是字节,每个字节占8位
调用这些数据结构实质上就是申请相对应大小的逻辑物理地址,编译器和操作系统会管理这些内存,将虚拟内存地址映射到物理内存地址,因此程序员通常无需担心物理内存地址。
这样的好处就是可以运行多个进程,而无需考虑地址冲突的问题
获取来的空间的作用:
就对数据类型char来说获取的空间为1字节,即8位大小,那么这8位本质上是用来干嘛的?
实质上获取的空间就是用二进制存等值的数据
例如:
char a = 12
本质上就是将(10)12转成二进制再写入a分配的8个字节的空间内
a = 00001100
其中第一位是符号位1代表正数,0代表负数,所以有符号char类型正数的范围就是
00000000 ~ 01111111 //转换成10进制就是(0 ~ 127) 或 (0 ~ 2^7 - 1)
那么负数怎怎么表示?
10000000 => -2^7或-128
那么-127就表示为:
10000001 //也就是 -128 + 1
那么-1就表示为:
11111111 // 也就是-128 + 127
这也就是为什么有符号char类型的负数范围为-1 ~ -128
当然对于无符号的数据类型unsigned char,即默认其为正数,第一位不再用以判别符号
10000000 => 128
10000001 => 128 + 1 => 129
//数据范围0 ~ 255
当然unsigned修饰其他数据类型也是一样的效果
这也就是为什么输入的整数超范围了就会变成负数:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
int main(){
char a = 128;
printf("%d", a);//10000000
return 0;
}
也可以在程序中溢出成0,但赋值不行:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
int main(){
char a = 255;
printf("%d", a + 1);//11111111 + 1
return 0;
}
至于为什么可以输出字符,存入字符,这都是因为字符对应ascii码,这个码本质上就是整数,printf通过%c查找对应字符输出罢了
例如:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
int main(){
int text1 = 97;
char text2 = 'c';
char text3 = 99;
printf("text1: %c\n", text1);
printf("text1: %d\n", text1);
printf("text2: %c\n", text2);
printf("text2: %d\n", text2);
printf("text3: %c\n", text3);
printf("text3: %d\n", text3);
}
需要注意的是:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
int main(){
double a = 1.5;
printf("%d", a);//11111111
return 0;
}
原因是:
在你的代码中,你声明了一个double类型的变量a,并将其初始化为1.5。然后,你使用printf(“%d”, a);来打印它。这实际上是一种未定义行为,因为你试图将double类型的值用%d格式字符串打印为整数,这可能导致不可预测的结果。
在某些情况下,编译器可能会将未定义行为的代码解释为0,但这是不可预测的行为,不应该依赖于这种行为。
stdint.h中的常用数据类型
在头文件中:
#include<stdint.h>
常用的数据类型有:
int8_t:有符号8位整数。
uint8_t:无符号8位整数。
int16_t:有符号16位整数。
uint16_t:无符号16位整数。
int32_t:有符号32位整数。
uint32_t:无符号32位整数。
int64_t:有符号64位整数。
uint64_t:无符号64位整数。
对其中例如uint8_t拆解分析
u指unsigned修饰 int指整形 8指占据8位 _t表示类型也就是type
其他的组成逻辑也是一样
还有值得一提的就是c中的数组与char指针:
char a[100];
申请char类型变量100空间,这个空间没有初始化,如果打印的话会发现内部装着一些垃圾信息,是之前程序留下来的
char * a = "abc";
char b[3];
b[0] = 'a';
b[1] = 'b';
b[2] = 'c';
上述操作是等效的b其实也是个指针
#include <stdio.h>
#include <stdio.h>
int main(){
char * a = "abc";
char b[] = "abc";
a++;
char * q = b;
q++;
printf("%s\n",a);
printf("%s\n", q);
return 0;
}
本质上一样,只是数组b是个不能更改的变量类似:
const char *b