- c语言中常见数据类型
int main(){
printf("%d\n", sizeof(char)); // 1个字节
printf("%d\n", sizeof(short)); // 2个字节
printf("%d\n", sizeof(long)); // 4个字节
printf("%d\n", sizeof(long long)); // 8个字节
printf("%d\n", sizeof(float)); // 4个字节
printf("%d\n", sizeof(double)); // 8个字节
printf("%d\n", sizeof(long double)); //c99标准 16个字节
return 0;
}
数据类型的意义在于表达数据在内存中占用空间大小,以及用用何种“眼光”去看待它。
- 整数类型在内存中的存储
int main(){
int a = 10;
int b = -10;
return 0;
}
在c语言中,整数类型占4个字节,但这4个字节在内存中如何表示呢?在此引入 原码 反码 补码 概念。在内存中,所有数据均以二进制表示即“0” 和 “1”。整数又分为有符号数和无符号数,在无符号数中所有为都表示数值,因此原反补码都相同。对于有符号数,规定为最高位为符号位,“1” 表示负数,“0” 表示正数。负数的原码为符号位为1,其他位不变,反码为原码的符号位不变,其他位取反,补码=反码+1。对于整形而言,内存中存放的就是补码
为什么要引入补码?
因为在cpu中没有减法器,只有加法器,不能直接进行减法运算。
例如:
// 计算 a - b
int a = 1, b = 1;
int c = a - b;
a = 000000000 00000000 00000000 00000001
-1原码 = 100000000 00000000 00000000 00000001
-1反码 = 111111111 11111111 11111111 11111110
-1补码 = 111111111 11111111 11111111 11111111
加法 + 000000000 00000000 00000000 00000001
结果 = 000000000 00000000 00000000 00000000
于是 a - b = a + (-b) = 1 + (-1) = 0
- 大小端介绍
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
例如:设计一个小程序来判断当前机器的字节序。
int check_sys();
int main(){
int a = 1;
int ret = check_sys();
if (ret == 1){
printf("小端\n");
}else{
printf("大端\n");
}
return 0;
}
int check_sys(){
int a = 1;
char* p = (char*)&a;// 强制类型转换,取出第一个字节中的数
// 如果是小端则返回1,大端则返回0
return *p;
}
a为整形变量,定义一个字符类型的指针指向a,因为指针p的类型为字符指针类型,解引用之后只能访问一个字节内容,若第一个字节存放的是1,则表示 该整数在内存中存储方式为:低位保存在低地址中即为小端存储方式。(文章开始提到数据类型表示了在内存中占用空间大小)
补码运算举例
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
%u 表示按无符号整形打印
-128 10000000
整形提升后
原码 10000000 00000000 00000000 10000000
反码 11111111 11111111 11111111 01111111
补码 11111111 11111111 11111111 10000000
本文参考比特鹏哥c语言教程