本篇博客用于记录自己c语言的学习心得,请大佬多多指教。
一、数据类型的分类
(1)整形 (2)浮点型 (3)构造类型 (4)指针类型 (5)空类型
应该注意因为char中存储的是字符的ASCII码值 所以属于整形
各类型占据字节:
char-1 short-2 int-4 long-4/8 long long-8 float-4 double-8
其中long的大小是大于等于int的 32位平台4个字节 64位平台8个字节
二、整形在内存中的存储
1.原码 反码 补码
整形在计算机中有3种表示方式,三种表示方式均有符号位和数值位组成。正数的原、反、补码相同。负数的原、反、补码中首位表示符号,0表述整数,1表示负数。
原码:直接将整数按照正负数的形式翻译成2进制
反码:原码的符号位不变,其他位按位取反
补码:反码+1.
注意:反码要想得到补码有两种方法。第一种:补码先-1得反码,再符号位不变,其余位按位取反得原码。第二种:补码符号位不变,其余位按位取反,然后+1。既补码再求一次补码就是它的原码。(感觉很神奇,我也不知道原因,希望能有数学大佬解释)
数据在内存中按照反码的形式存储
2.大小端
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中。
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中。
通俗点,就是大端就是正常将数据存在内存中,小端是倒着存放。
#includeint check_sys() { int i = 1; return (*(char *)&i); } int main() { int ret = check_sys(); if(ret == 1) { printf("小端n"); } else { printf("大端n"); } return 0; }
此代码可以检测编译器是大端存储还是小端存储。此代码的核心在于:
*(char *)&i; i=1的补码是00000000 00000000 00000000 00000001
(char *)将1的地址强制转换为一个字节 在使用*取地址即只能取一位地址,如果是大端取的是0所以输出大端,小端则反之。
再来看这个代码会输出什么结果。
#includeint main() { char a= -1; signed char b=-1; unsigned char c=-1; printf("a=%d,b=%d,c=%d",a,b,c); return 0; }
-1是整形原码:10000000 00000000 00000000 00000001
反码:111111111 111111111 111111111 111111110
补码:111111111 111111111 111111111 111111111
存入a中后 111111111
因为a是char占据1个字节,int数据存入char变量 要进行截断,即保留1个字节,删除前面
发生截断会导致数据出现错误,因此自己写代码时要避免这种情况。
输出“a = %d”,以%d的形式输出a的值要进行整形提升,a是char型 有符号整形提升时首位是1前面就补1,首位是0就补0。如果是无符号型,则直接补0。
整型提升后: 11111111 11111111 111111111 11111111
此时为补码,变反码:11111111 11111111 111111111 11111110
原码: 1000000 0000000 00000000 0000001
所以输出结果为-1
11点了,好困,b,c的过程不想再写了
今天就先总结到这里,希望大佬能指正我的错误,更欢迎其他初学者交流,谢谢啦!!!



