09 C类型说明符
2018-10-30 本文已影响0人
亨锅锅
#include <stdio.h>
int main()
{
/*
* 1.计算机是一个电器, 所以只是识别通电和断电两种状态
* 2.在计算机中如何表示通电和断电 0 和 1来表示
* 3.因为计算机只能识别通电和断电, 而在计算机中是用0和1来表示通电和断电的,
* 所以计算机只能识别0和1, 所以在计算机中存储的所有数据都是0和1组成的
*
* 1.在计算机中1个字节占用8位
*/
/*
* 1.定义变量的目的就是为了在内存中开辟一块存储空间
* 2.定义变量时指定数据类型的目的就是为了告诉计算机需要开辟多大的存储空间
* 3. char在内存中占用一个字节, int在内存中占用4个字节, double在内存中占用8个字节
* sizeof(char);sizeof(int);sizeof(double);
*/
/*
* 1.计算机分配内存的规则: 从大到小的分配
* 2.变量名称对应的是变量占用内存最小的那个字节
*/
int num;
/*
* 1.由于计算机只能识别0和1, 所以会把十进制的9先转换为二进制的9
* 左边是二进制的高位 右边是二进制的低位
* 0000 0000 0000 0000 0000 0000 0000 1001
*
* 2.给变量分配内存的时候是从内存地址比较大的开始分配
* 所以计算机在存储数据的时候, 也会从内存地址比较大的开始存储
* 会从转换好的二进制高位开始依次存入分配好的内存中
*/
num = 9;
return 0;
}
#include <stdio.h>
int main()
{
int num1;
int num2;
num1 = 9; // 0000 0000 0000 0000 0000 0000 0000 1001
num2 = 4; // 0000 0000 0000 0000 0000 0000 0000 0100
/*
* %p是专门用于输出变量地址的
* &是专门用于取出变量地址
*
*/
printf("&num1 = %p\n", &num1); // &num1 = 0060FEAC
printf("&num2 = %p\n", &num2); // &num2 = 0060FEA8
char ch;
/*
* 1.由于计算机只能识别0和1, 所以不能直接将字符a存储到内存中
* 字符在计算机中存储的其实是它对应的ASCII码值
* 2.ASCII码是什么? http://tool.oschina.net/commons?type=4
* ASCII码是老美规定的一套字符对应的数值表
* 3.为什么老美要规定这么一套字符对应的数值表
* 因为计算机有很多的厂商(戴尔/联想/小米/苹果), 除此之外计算机还有很多类型的操作系统(Windows, Mac OS, Linux)
* 正是因为有很多的电脑厂商和很多的系统, 所以如果没有规定字符a在内存中如何存储, 那么就会导致程序只能在某个品牌的某种操作系统上能够正确运行
* Windows存储A是存储的66
* Mac OS存储A是存储的77
*
* 3.C语言的规则: 不看怎么存只看怎么取
*
* 注意点:
* char类型占用1个字节, 所以只有8位可以存储数据
* ASCII码表中字符对应的ASCII值是从0~127
* 0111 1111 // 127
+ 0000 0001 // 1
--------------
* 1000 0000
*
* char类型的取值范围 -2^7 ~ 2^7-1 / -128~127
*/
ch = 'a'; // 'a' --> 97 --> 0110 0001
printf("%i\n", ch);
/*
* 总结: 字符存储的顺序:
* 1.根据字符在ASCII码表中找到对应的十进制数
* 2.将找到的十进制数转换为二进制
* 3.将转换好的二进制存储到内存中
*/
return 0;
}
#include <stdio.h>
char upperCase(char);
int main()
{
// 以下两个变量在内存中是如何存储的
// int num = 6; // 0000 0000 0000 0000 0000 0000 0000 0110
// char ch = '6'; // 0011 0110
// 要定定义一个函数实现用户传入小写字母, 将其转换为大写字母
/*
*
* a --> 97
* A --> 65
*
* b --> 98
* B --> 66
*
* 通过观察得出一个结论
* 无论是哪个字母的小写和大写之间的ASCII码都相差 32
* 只要让小写字母的ASCII码值减去32就是大写字母的ASCII码
*/
// char ch = 'a';
// char res = ch - 32;
// // 注意点: C语言不看怎么存, 就看怎么取
// printf("res = %c\n", res);
char res = upperCase('m');
printf("res = %c\n", res);
return 0;
}
// 该函数的功能是将小写字母转换为大写字母
char upperCase(char ch){
// 1.安全校验, 判断用户传入的是否是一个字母
// 在企业开发中, 尽量不要写数字
// 如果ASCII哪天变化了我们需要修改代码
// if(ch < '97' || ch > '122'){
if(ch < 'a' || ch > 'z'){
printf("请传入一个合法数据\n");
return ' ';
}
char res = ch - ('a' - 'A');
return res;
}
#include <stdio.h>
int main()
{
/*
* 类型说明符
* 类型说明符一般都是用于修饰int类型的
*
* 1.说明长度的
* short
* long
* long long
* ------------------------------------
* char 1个字节 -2^7~2^7-1 -128~127
* short int 2个字节 -2^15~2^15-1
* int 4个字节 -2^31~2^31-1
* long int:
* 如果在32位编译器中, long int 占用4个字节
* 如果在64位编译器中, long int 占用8个字节
*
* long long int 8个字节 -2^63~2^63-1
* 注意点:
* 1.如果存储的数据超出了类型对应的取值范围, 那么就会导致存储的数据不对
* 2.由于内存非常有限, 所以在编写程序的时候, 尽量合理的定义变量
*/
// char ch1 = 127;
// printf("ch1 = %i\n", ch1);
// char ch2 = 128; // 存储的数据超出了范围
// printf("ch1 = %i\n", ch2); // 取出的数据和存储的数据不一致
// int num = 12345678901;
// printf("num = %i\n", num);
// int num1 = 6; //0000 0000 0000 0000 0000 0000 0000 0110
// long long int num2 = 12345678901;
// // 注意点: C语言不看怎么存, 只看怎么取
// // %i是按照int来取, %lli按照long long int来取
// printf("num = %lli\n", num2);
// char ch;
// short int num1;
// int num2;
// long int num3;
// long long int num4;
// printf("ch = %i\n", sizeof(ch));
// printf("short = %i\n", sizeof(num1));
// printf("int = %i\n", sizeof(num2));
// printf("long = %i\n", sizeof(num3));
// printf("long long = %i\n", sizeof(num4));
// 由于说明长度的类型说明符一般都是用于说明int类型的, 所以在使用的时候可以省略int
// short --> %hi, long --> %li, long long --> %lli
short num1 = 123; // short == short int
printf("num1 = %hi\n", num1);
long num2 = 123; // long == long int
printf("num2 = %li\n", num2);
long long num3 = 123; // long long == long long int
printf("num3 = %lli\n", num3);
return 0;
}
#include <stdio.h>
int main()
{
/*
* 类型说明符
* 类型说明符一般都是用于修饰int类型的
*
* 1.说明长度的
* short
* long
* long long
*
* 2.说明符号位的
* unsigned 无符号的:
* 不把二进制的第一位当做符号位来使用, 所以只能存储零和正数, 不能存储负数
* 注意点: 如果变量被unsigned修饰了, 那么取出的时候必须使用%u, %u就代表用无符号的方式取出
* 应用场景: 存储银行存款, 学生的分数等不能出现负数的情况
*
* signed 有符号的:
* 默认int就是有符号的, 就可以保存负数,零,正数, 所以signed一般用不上
*
*
* 0000 0000 0000 0000 0000 00000 0000 0000
* 对于整数而言, 在内存中二进制的第一位就是符号位
* 如果第一位是0, 代表当前的整数是一个正数
* 如果第一位是1, 代表当前的整数是一个负数
* 默认情况下所有的int类型都是有符号的, 也就是都会将第一位看做符号位, 也就是可以保存负数,零,正数
*/
// int num1 = -6;
// int num2 = 6;
// int num3 = 0;
// printf("num1 = %i\n", num1);
// printf("num2 = %i\n", num2);
// printf("num3 = %i\n", num3);
// signed int num1 = -6;
// signed int num2 = 6;
// signed int num3 = 0;
// printf("num1 = %i\n", num1);
// printf("num2 = %i\n", num2);
// printf("num3 = %i\n", num3);
unsigned int num1 = -6;
unsigned int num2 = 6;
unsigned int num3 = 0;
printf("num1 = %u\n", num1);
printf("num2 = %u\n", num2);
printf("num3 = %u\n", num3);
return 0;
}