目录
浅谈
构造类型:(自定义类型)
指针类型
空类型
整型在内存中的存储
为什么内存中一定用补码
大小端字节序存储
?2015百度面试题目
习题
习题1
习题2
习题3
?习题5
习题6
浅谈
c本身具有的类型:
整型:
char
short
int
long
long long
浮点型:
float
doubl
虽然 int 和 float都是4byte,但是视角不一样一个认为整型另一个认为浮点型。
int main()
{
signed short int a=0;
unsigned short b=0;
char c;//有符号?还是无符号?
//取决于编译器,大部分的编译器下char就是signed char,其他数据类型也是同样的道理
}
char--1byet--8bit 假设都是1
11111111---计算机存储放的都是补码
当我们认为是unsigned--11111111里的每一位都是有效位。
int main()
{
unsigned char c1=255;
printf("%d\n",c1);
char c2=255;
printf("%d\n",c2);
return 0;
}
?
?c1,c2在内存中的值都是1,但是显示的结果不一样的原因就是有符号和无符号的区别
signed char c1其实能算出无符号字符型的范围
?unsigned char
构造类型:(自定义类型)
数组类型
结构体类型struct
枚举类型 enum
联合类型union
int main()
{
int a=10;
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(int));
int arr[10];
printf("%d\n",sizeof(arr));
printf("%d\n",sizeof(int [10]));
//这里其实就可以看出数组也是有类型的只不过当数组元素个数不同气类型也会变化int arr[5]---in [5]
return 0;
}
指针类型
int *pi;
char*pc
float*pf
void*pv
空类型
void表示空类型(无类型)
通常应用于函数的返回类型,函数的参数,指针类型
int mian()
void test(void)//void test()
{
printf("hehe\n");
}
{
test();
test(100);
return 0;
}
整型在内存中的存储
int main()
{
int a=-1;
return 0;
}
这种现象其实就可以用原反补的概念来解释
正整数 原反补相同
负整数 原码就是带上符号位和时间显示的值
反码 符号位不变其余取反
补码在反码的基础上+1
a=-1
10000 0000 0000 0000 0000 0000 0000 0001-原码
1111 1111 1111 1111 1111 1111 1111 1110-反码
1111 1111 1111 1111 1111 1111 1111 1111-ff也就补码
这里ff就可以看出内存中存储的就是补码
为什么内存中一定用补码
cpu只会加法运算
?
?
大小端字节序存储
?
?2015百度面试题目
设计程序 判断大小端
//int main()
//{
// int a = 1;
// char* p = (char*)&a;
// if (*p == 1)
// printf("小端\n");
// else
// printf("大端\n");
// return 0;
//}
//int check_sys()
//{
// int a = 1;
// char* p = (char*)&a;
// return *p;
//}
int main()
{
//大端返回0
//小端返回1
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
int check_sys()
{
int a = 1;
return* (char*)&a;
}
int main()
{
//大端返回0
//小端返回1
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
习题
习题1
int main()
{
char a = -1;
//1000 0000 0000 0000 0000 0000 0000 0001--原码
//1111 1111 1111 1111 1111 1111 1111 1110--反码
//1111 1111 1111 1111 1111 1111 1111 1111--补码
//1111 1111 ---a//发生截断选取低八位---补码
// %d以有符号整数的形式进行打印 char--->int
// 整型提升
//1111 1111 1111 1111 1111 1111 1111 1111---a整型提升后的补码
//1111 1111 1111 1111 1111 1111 1111 1110---a整型提升后的反码
//1000 0000 0000 0000 0000 0000 0000 0001---a整型提升后的原码
signed char b = -1;
//1000 0000 0000 0000 0000 0000 0000 0001--原码
//1111 1111 1111 1111 1111 1111 1111 1110--反码
//1111 1111 1111 1111 1111 1111 1111 1111--补码
//int---->char 发生阶段选取第八位
//1111 1111 --截断后b的补码
//%d---以有符号整数的形式打印char---->int要发生整型提升
//1111 1111 1111 1111 1111 1111 1111 1111---->整型提升后的b的补码
//1111 1111 1111 1111 1111 1111 1111 1110---->整型提升后b的反码
//1000 0000 0000 0000 0000 0000 0000 0001---->整型提升后b的原码
unsigned char c = -1;
//1000 0000 0000 0000 0000 0000 0000 0001--原码
//1111 1111 1111 1111 1111 1111 1111 1110--反码
//1111 1111 1111 1111 1111 1111 1111 1111--补码
//发生截断
//1111 1111
//整型提升
//0000 0000 0000 0000 0000 0000 1111 1111
printf("%d %d %d ",a,b,c);
return 0;
}
习题2
int main()
{
char a = -128;
//10000 0000 0000 0000 0000 0000 1000 0000
//10000 0000 0000 0000 0000 0000 0111 1111
//11111 1111 1111 1111 1111 1111 1000 0000
//截断
//1000 0000
//%u以无符号整型输出---->整型提升
//0000 0000 0000 0000 0000 0000 1000 0000---补码
//0000 0000 0000 0000 0000 0000 0111 1111---反码
//1111 1111 1111 1111 1111 1111 1000 0000---原码超大的一个正数字
printf("%u\n",a);
return 0;
}
习题3
int main()
{
int i = -20;
//1000 0000 0000 0000 0000 0000 0001 0100 --->i原码
//1111 1111 1111 1111 1111 1111 1110 1011 ---->i反码
//1111 1111 1111 1111 1111 1111 1110 1100 ---->i码
unsigned int j = 10;
//0000 0000 0000 0000 0000 0000 0000 1010 ---->j原码反补都一样
printf("%d\n",i+j);
//i+j
//1111 1111 1111 1111 1111 1111 1110 1100
//0000 0000 0000 0000 0000 0000 0000 1010
//1111 1111 1111 1111 1111 1111 1111 0110---->i+j的补码
//1111 1111 1111 1111 1111 1111 1111 0101---->i+j的反码
//1000 0000 0000 0000 0000 0000 0000 1010---->i+j的原码 -10
return 0;
}
?习题4
#include<windows.h>
int main()
{
unsigned int i = 0;
//9 8 7 6 5 4 3 2 1 0 -1
for (i = 9; i >= 0; i--)
{
printf("%u ",i);
Sleep(1000);
}
return 0;
}
?习题5
#include<string.h>
int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
//1000 0000 0000 0000 0000 0000 0000 0001
//1000 0000 0000 0000 0000 0000 0000 0000
//1111 1111 1111 1111 1111 1111 1111 1111
//1111 1111
}
printf("%d",strlen(a));
return 0;
}
习题6
unsigned char i = 0;
int main()
{
for (i = 0; i <= 255; i++)
{
printf("heheh\n");
}
return 0;
}
上述代码明显会死循环因为char i最大就是255当+1是往前进1变成1 0000 0000 因为截断的问题i又会变为0
A^A 睡觉去喽
|