练习7-1
#include <stdio.h>
int main(void)
{
int n;
printf("sizeof 1 =%u\n", sizeof 1); //1是int型,该类型的长度是4
printf("sizeof +1 =%u\n", sizeof + 1); //+1是int型,该类型的长度是4
printf("sizeof -1 =%u\n", sizeof - 1); //-1是int型,该类型的长度是4
printf("sizeof(unsigned)-1 =%u\n", sizeof(unsigned) - 1); //ubsigned型的长度是4,减去1变成3
printf("sizeof(double)-1 =%u\n", sizeof(double) - 1); //double类型的长度是8,减去1变成7
printf("sizeof((double)-1) =%u\n", sizeof((double)-1)); //((double)-1)仍然是double类型,长度为8
printf("sizeof n+2 =%u\n", sizeof n + 2); //n为整型,长度为4,加2变成6
printf("sizeof (n+2) =%u\n", sizeof(n + 2)); //(n+2)仍为int型,长度为4
printf("sizeof (n+2.0 =%u\n", sizeof(n + 2.0)); //(n+2.0)为double型,长度为8
return 0;
}
练习7-2
#include <stdio.h>
#include <math.h>
int main(void)
{
unsigned x;
int n;
printf("请输入无符号整数:"); scanf_s("%u", &x);
printf("请输入位移的位数:"); scanf_s("%d", &n);
printf("向左位移后是否溢出?\n");
((x << n) == (x * pow(2, n))) ? printf("相等") : printf("不等");
putchar('\n');
printf("向右位移后是否溢出?\n");
((x >> n) == (x / pow(2, n))) ? printf("相等") : printf("不等");
return 0;
}
练习7-3
#include <stdio.h>
unsigned rrotate(unsigned x, int n)
{
return x >> n;
}
unsigned lrotate(unsigned x, int n)
{
return x << n;
}
int main(void)
{
unsigned x;
int n;
printf("请输入无符号整数:"); scanf_s("%u", &x);
printf("请输入移动位数:"); scanf_s("%d", &n);
printf("无符号数%u左移%d位变成%u\n", x, n, lrotate(x, n));
printf("无符号数%u右移%d位变成%u\n", x, n, rrotate(x, n));
return 0;
}
练习7-4
#include <stdio.h>
//二进制最低位为0位,最高位为(2^n-1)位
/*---将无符号型整数x的第pos位设置为1---*/
unsigned set(unsigned x, int pos)
{
int i=1;
return x | (i << pos);
}
/*---将无符号型整数x的第n位设置为0---*/
unsigned reset(unsigned x, int pos)
{
int i = 1;
return x & ~(i << pos);
}
/*---将无符号型整数x第pos位取反---*/
unsigned inverse(unsigned x, int pos)
{
int i = 1;
return x ^ (i << pos);
}
int main(void)
{
unsigned x;
int n;
printf("请输入无符号整数x:"); scanf_s("%u", &x);
printf("请输入操作位数:"); scanf_s("%d", &n);
printf("无符号整数%u第%d位设为1,变成%u\n", x, n, set(x, n));
printf("无符号整数%u第%d位设为0,变成%u\n", x, n, reset(x, n));
printf("无符号整数%u第%d位设为取反,变成%u\n", x, n, inverse(x, n));
return 0;
}
练习7-5
#include <stdio.h>
//二进制低位为第0位,高位为第(2^n-1)位
/*---将无符号型整数第pos位到第(pos+n-1)位的n位设为1---*/
unsigned set_n(unsigned x, int pos,int n)
{
int i;
int j=0;
for (i = 0; i < n; i++) { //从第0位到第(n-1)位均为1
j <<= 1;
j | 1;
}
j <<= pos; //将j左移pos位,此时第pos位到第(pos+n-1)位均为1
return j | x; //采用逻辑或,将无符号型整数第pos位到第(pos+n-1)位的n位设为1
}
/*---将无符号型整数第pos位到第(pos+n-1)位的n位设为0---*/
unsigned reset_n(unsigned x, int pos, int n)
{
int i;
int j=0;
for (i = 0; i < n; i++) { //从第0位到第(n-1)位均为1
j <<= 1;
j | 1;
}
j << pos; //将j左移pos位,此时第pos位和第(pos+n-1)位均为1
return x & (~j); //先将j按位取反,再与x按位采用逻辑与,将无符号型整数第pos位到第(pos+n-1)位的n位设为0
}
/*---将无符号型整数第pos位到第(pos+n-1)位的n位按位取反---*/
unsigned inverse_n(unsigned x, int pos, int n)
{
int i;
int j=0;
for (i = 0; i < n; i++) {
j <<= 1;
j | 1;
}
j << pos;
return x ^ j; //按位异或,无符号型整数x第pos位和第(pos+n-1)位取反
}
练习7-6
#include <stdio.h>
#include <limits.h>
int main(void)
{
unsigned x, y;
x = UINT_MAX;
y = 0;
printf("x=%u\n", x);
printf("x+1=%u\n", x + 1);
printf("y=%u\n", y);
printf("y-1=%u\n", y - 1);
return 0;
}
练习7-7
#include <stdio.h>
int main(void)
{
float a;
double b;
long double c;
printf("a="); scanf_s("%f", &a);
printf("b="); scanf_s("%lf", &b);
printf("c="); scanf_s("%lf", &c);
printf("a=%f\n", a);
printf("b=%f\n", b);
printf("c=%lf\n", c);
return 0;
}
练习7-8
#include <stdio.h>
int main(void)
{
printf("sizeof(float) =%u\n", (unsigned)sizeof(float));
printf("sizeof(double) =%u\n", (unsigned)sizeof(double));
printf("sizeof(long double)=%u\n", (unsigned)sizeof(long double));
return 0;
}
练习7-9
#include <stdio.h>
#include <math.h>
int main(void)
{
double x;
printf("请输入正方形面积x="); scanf_s("%lf", &x);
printf("正方形的面积为%f\n", sqrt(x));
return 0;
}
#include <stdio.h>
int main(void)
{
float x1 = -0.01;
float x2 = 0;
int i;
for (i = 0;i<=100;i++)
{
printf("x = %f x = %f\n", x1 += 0.01, (x2++) / 100);
}
return 0;
}
练习7-11
代码清单7-11改写
#include <stdio.h>
int main(void)
{
float x, y = 0.0;
for (x = 0.0; x <= 1.0; x += 0.01) {
printf("x=%f ", x);
y += x;
printf("x的累计和=%f\n",y);
}
return 0;
}
代码清单7-12改写
#include <stdio.h>
int main(void)
{
int i;
float x, y=0;
for (i = 0; i <= 100; i++) {
printf("x=%f ", i / 100.0);
printf("x的累计和=%f\n", y += i/100.0);
}
return 0;
}