一,选择题
(1)隐式类型强转
警告:
1.类型提升由 符号位 和 数据类型 决定,符号位为1,扩展前面补1。无符号数扩展前面补0。
2.进行数据识别按照低位个数识别。
(2)内存分配
结构体,位端进行对齐时,当对齐数与默认对齐数冲突时,去取其中的较小值。结构体整个对齐时,满足结构体成员中的最大对齐数能对其且满足结构体整体对齐时即可。
(3)类型强转
类型强转不改变所要强转地址的值,只改变其所指向的类型。
(4)大小端问题
union tagAAA
{
int a;
char b;
}
tagAAA.b=1;
if(a==1)
{
printf("小端模式");
}
else
{
printf("大端模式");
}
注意:分配a与b的值时指向第一个位置(低地址的第一个字节),读取数据时,打印数据先打印高位。
一般取字节为最小单位,一个字节中有8位,从左往右,位逐次增大。(与大小地址方向可能会有所不同)
二,程序题
主要问题:1.考虑问题应该尽可能全面,所举例子只是其中出现的一种情况。
(1).实现一个对8bit数据(unsigned char 类型)的指定位置0或置1,并使其他位保持不变。
void bit_set(unsigned char *p_data, unsigned char position, int flag)
{
assert(p_data);
if ((position >= 1) && (position <= 8))
{
if (flag == 1)
{
*p_data |= (1 << (position - 1));
}
else if (flag == 0)
{
*p_data &= (~(1 << (position - 1)));
}
}
}
(2)实现字符串右循环移位函数
#include<stdio.h>
#include<windows.h>
#include<assert.h>
void RightLoopMove(char *pStr, unsigned short steps);
void reverse(char*a, char* b);
int main()
{
char a[] = " hello beon";
RightLoopMove(a, 4);
puts(a);
system("pause");
return 0;
}
void RightLoopMove(char *pStr, unsigned short steps)
{
assert(pStr);
int len = strlen(pStr);
steps %= len;
reverse(pStr, pStr + len - steps - 1);
reverse(pStr + len - steps, pStr + len-1);
reverse(pStr, pStr + len - 1);
}
void reverse(char*a, char*b)
{
assert(a);
assert(b);
while (a < b)//核心代码
{
(*a) ^= (*b);
(*b) ^= (*a);
(*a) ^= (*b);
a++; //此处一定不要忘记了
b--;
}
}
(3)请编写程序实现字符串到整数的转换。
注意:
考虑点1.‘+’,‘-’问题
2.字符串过长,溢出怎么解决?
3.转换
enum error_code//在主函数进行判断myatoi函数返回的值是否溢出
{
OK,
ERR,
}error_code;
int myatoi(const char *pStr)
{
assert(pStr);
int flag = 1;//正负符号标志
long long ret = 0;//声明longlong 型,因为要对int是否溢出判断
if (*pStr == '-')
{
flag = -1;
pStr++;
}
else if (*pStr == '+')
{
pStr++;
}
while (*pStr != '\0')
{
if ((*pStr >= '0') && (*pStr <= '9'))
{
ret = ret * 10 + (*pStr - '0')*flag;
if ((ret <= INT_MIN)||(ret >= INT_MAX))
{
error_code = ERR;
return -1;
}
}
else
{
break;
}
pStr++;//既然要遍历就要++
}
return ret;
}