练习7-2
/*编写一个程序,确认只要没有发生高位溢出,则:
无符号整数位左移后的值等于其乘以2的指数幂后的值。
无符号整数位右移后的值等于其除以2的指数幂后的值。*/
#include #include int main(void)
{
unsigned uns_int;
puts("请输入一个整数:");
do{
scanf("%u",&uns_int);
if(uns_int > UINT_MAX)
printf("您输入的整型过大,请重新输入。");
} while (uns_int > UINT_MAX);
printf("把整数向左移动3位后其值等于其乘以2的指数幂后的值:%u = %u\n",uns_int << 3, uns_int*2*2*2);
printf("把整数向右移动3位后其值等于其乘以2的指数幂后的值:%u = %u",uns_int >> 3, uns_int/2/2/2);
return 0;
}
练习7-3
/*---编写rrotate函数,返回无符号整数x右移n位后的值。
编写lrotate函数,返回无符号整数x左移n位后的值。---*/
#include unsigned rrotate(unsigned x, int n){
return x >> n;
}
unsigned lrotate(unsigned x, int n){
return x << n;
}
int main (void){
unsigned uns_int;
int move_bits;
printf("请输入整数和移动位数:");
scanf("%d %d",&uns_int, &move_bits);
printf("%u向右移%d次后的值:%u\n",uns_int, move_bits, rrotate(uns_int, move_bits));
printf("%u向左移%d次后的值:%u",uns_int, move_bits, lrotate(uns_int, move_bits));
return 0;
}
练习7-4
/*---编写set函数,返回将无符号整数x的第pos位设为1后的值。---*/
//二进制的最右边位为第零位。
#include unsigned set(unsigned x, int pos){
unsigned i = 1;
return x | (i << pos);
}
unsigned reset(unsigned x, int pos){
unsigned i = 1;
return x & ~(i << pos);
}
unsigned inverse(unsigned x, int pos){
unsigned i = 1;
return x ^ (i << pos);
}
int main(void)
{
unsigned i, pos;
printf("请输入整型数及要操作的位数:");
scanf("%u %u",&i ,&pos);
printf("将第%d位设为1后的值%d\n",pos,set(i, pos));
printf("将第%d位设为0后的值%d\n",pos,reset(i, pos));
printf("将第%d位取反后的值%d",pos,inverse(i, pos));
return 0;
}
练习7-6
/*---编程确认对无符号整数执行算术运算不会发生数据溢出。---*/
#include #include int main(void)
{
unsigned i, j;
printf("无符号整型的最大值为: %u\n",UINT_MAX);
puts("请输入一个整型数:");
scanf("%u", &i);
printf("将无符号整形最大值与输入整型数相加:%u",UINT_MAX + i);
return 0;
}
练习7-7
/*---从键盘输入float型,double型,long double型的变量,并显示其值。---*/
#include int main (void)
{
float fl;
double db;
long double ldb = 4.55;
puts("请依次输入三个浮点数:");
scanf("%f %lf",&fl, &db);
printf("float型:%f\ndouble型:%f\nlong double型:%Lf",fl, db, ldb);
return 0;
}
练习7-8
/*---显示三种浮点型的长度---*/
#include int main(void)
{
float fl;
double db;
long double ldb;
printf("float length %d\ndoble length %d\nlong double length %d", (unsigned)sizeof(fl), (unsigned)sizeof(db), (unsigned)sizeof(ldb));
return 0;
}
练习7-9
/*---输入一个实数作为面积,求面积为该实数的正方形的边长。---*/
#include #include int main(void)
{
int area;
puts("请输入一个正方形的面积:");
scanf("%d", &area);
printf("该正方形的边长为:%f",sqrt(area));
return 0;
}
练习7-10
/*横向显示代码,以0.01为单位将float型变量由0.0递增为1.00的过程。*/
#include int main(void)
{
int i;
float x, j = 0;
for (i = 0; i <= 100; i++) {
printf("x = %f ", j);
j+=0.01;
x = i / 100.0;
printf("x = %f\n",x);
}
return 0;
}
算术类型
字符型,整型的名称和简称
逻辑位移:逻辑唯一不考虑符号位,所有二进制位都进行位移。负整数右移时,符号位由1变为0,位移的结果为0或正整数。
算术位移:算术位移会保留最高位的符号位,只有其他位会进行位移。用位移前的符号位来填补空位。位移前的符号位来填补空位。位移前后符号不变。
与运算符:&(有0则0)
或运算符: | (有1则1)
异或运算符:^ (同0异1)
非运算符: ~
数据溢出和异常:因数据溢出(overflow)(溢位)使运算结果超出可表示的数值范围或违反数学定义(除以0等)时会发生异常(exception)。发生异常时程序如何运行是由编译器决定的。实际上,并非所有的运算中都会发生异常。无符号整数型的运算不会发生数据溢出。当无符号整型的运算结果超出最大值时,结果为“数学运算结果%(该无符号整型能够表示的最大值+1)"。
运算符一览表