C语言_常用数据类型&地址的理解

常用基本数据类型:

#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>

 
int main(){
     
    char * a = "abc";
    char b[] = "abc";
    a++;
    char * q = b;
    q++;
    printf("%s\n",a);
    printf("%s\n", q);
    return 0;
}


在这里插入图片描述

本质上一样,只是数组b是个不能更改的变量类似:

char * const b

指针常量罢了

char *a = "123"其数据存放在常量储存区,通过指针只可以访问字符串常量,但不能改变

char *a[] = "123"其存在栈中,可访问可修改

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值