1:计算的时候 内存存的是补码
2:无符号数和有符号数相加 结果自动转化成无符号数 一定是非负数
3:i =-20 ; j= -10; i+j不能直接用-20+10计算 需要转化成二进制存储后进行运算 因为涉及到一个类型的问题
4:以下输出结果是什么
int main()
{
unsigned int i ;
for(i = 9;i >=0; i--)
{
printf("%u\n",i);
}
}
步骤:i是个无符号类型 站在无符号的角度 它不可能有负数的 不可能有负数的话 最小值就是0 对于无符号数它最小值是0 那它恒大于等于0 这个判断条件 恰巧是i>=0 所以恒成立 恒成立这个代码就死循环了
unsigned int这个类型 当你去定义i的时候 只是说站在i的角度 里面是无符号数 而i放在打印的时候 i又说的不算了 i只是一块内存区域 我们在打印的时候 如果写成%u内存里确实是无符号数 如果写成%d 即使i是无符号数 我也认为内存里存的是有符号数数字
5:以下代码输出什么
int main()
{
char a[1000];
int i;
for(i=0;i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d",strlen(a));
return 0;
}
思路:第一行 定义一个数组 a 能存1000个数
第二行 定义一个i 四个字节
第三行 i赋值0 判断 0<1000;进入下一行代码
第四行:a[0] = -1 - 0; 返回到for循环
i++ 变成i = 1;判断1<1000;进入循环体 a[1] = - 1- 1;执行++
char类型的取值范围是-128~127
从a[0]=-1 到a[127] =-128
a[1] = -2
-1~-128是128个
127~1是127个
所以加一起是255个
strlen是遇0就结尾了 0还不算个数
然后 a[128] = -1 - 128 = 127
a[129] = 126
为什么不是-129 因为在char类型里面 存不上-129 到-128后自动转变为 127
-129如果用最少的bit位 也得是9位 而char类型最多能存8位
strlen是找\0 也就是找0为统计个数的结尾 这样 实际上统计了 -1~-128 和-128~0的这些数的个数 一共是255个
巧记口诀:超出范围的数 如果是正数 则减去256 超出范围的数如果是负数 则加上256
6:strlen()是遇0结尾 0不算个数 如果想计算带0的 得用sizeof总体积除以第一个体积 得个数
为什么 strlen(arr1)得到的结果是 1呢
strlen寻找的时候是按照存在内存里每一个字节去寻找\0 第一个数1 存在内存里是 01 00 00 00 是小端 所以当寻找到第一个字节 01 后 遇到第二个字节 00 就是遇到了\0 所以strlen就不往后计算了 就是1 strlen(arr1) 为什么不是4字节4字节来看呢 汪汪说 strlen不知道你给他的是不是字符数组,但是不管你给他什么,他都是一个字节一个字节走 strlen函数实现的时候定义一个字符指针char *p,定义一个count。从第一次字符开始走,。每次p++因为盘、是字符指针,都走1字节,然后count+1
为什么sizeof(arr2)得到的结果是5呢
因为love是字符串类型 默认后面跟着个\0 \0在sizeof操作符中 也算作一个体积 所以是5
为什么 strlen(arr2)得到的结果是4呢
strlen计算的是 \0前面的个数 \0不算个数 字符串末尾默认跟个\0 所以strlen计算结果是7:字符串就是存ascii码值
8:以下代码输出什么
int main()
{
unsigned int i;
for(i = 9;i >= 0; i--)
{
printf("%u\n",i);
}
return 0;
} 无限死循环
9:以下代码输出什么
unsigned char i = 0;
int main()
{
for (i = 0; i <=255; i++)
{
printf("hello world\n");
}
return 0;
}
思路:因为unsigned char取值范围是0-255 最小是0 最大是255 而for循环的判断条件是i <=255 所以恒成立 这样就死循环了