建设一个网站需要做哪些工作内容,站酷官网入口,电商设计是做什么的工作,静态手机网站建设的基本特点文章目录 1.数据类型转换在分析源程序之前#xff0c;我们需要了解几个基本概念#xff1a;现在来分析源程序中的变量及其对应的十进制真值以及扩展操作方式#xff1a; 1.1. short si -32768;1.2. unsigned short usi si;1.3. int i si;1.4. unsigned ui usi; 2#x… 文章目录 1.数据类型转换在分析源程序之前我们需要了解几个基本概念现在来分析源程序中的变量及其对应的十进制真值以及扩展操作方式 1.1. short si -32768;1.2. unsigned short usi si;1.3. int i si;1.4. unsigned ui usi; 2编写程序说明不同数据类型之间进行转换时在表数范围和精度上的变化。2.1. 给定一个short型数据 -12345分别转换为int、unsigned short、unsigned int、float类型的数据2.2. 给定一个int型数据2147483647分别转换为short、unsigned short、unsigned int、float、double类型的数据2.3.给定一个float型数据123456.789e5转换成int、double型数据2.4.给定一个double型数据123456.789e5转换成int、float型数据。#include stdio.h根据实验结果回答下列问题1补码整数如int型数是否总能转换为等值的float类型数据为什么2float型数据是否总能转换成等值的double型数据为什么3长数被截断成短数后可能发生什么现象为什么 3.编程计算下列表达式的值3.1. unsigned int型数据 142949672951-42949672953.2. int型数据21474836471-2147483648-1 在程序设计中数据类型转换和运算溢出是一个常见但也容易被忽视的问题。本文通过具体的代码示例深入分析了不同数据类型之间的转换及在运算过程中可能出现的溢出现象旨在帮助读者更加深入地理解这些概念。 1.数据类型转换
让我们首先来分析下列源程序中的变量在机器内是如何表示的以及各变量对应的十进制真值是多少无符号数和带符号整数的扩展操作方式是否相同各是如何进行的
#include stdio.h
int main()
{short si -32768;unsigned short usi si;int i si;unsigned ui usi;printf(%d\n, si);printf(%u\n, usi);printf(%d\n, i);printf(%u\n, ui);return 0;
}在分析源程序之前我们需要了解几个基本概念
有符号整数以补码形式存储最高位为符号位0表示正数1表示负数。无符号整数以二进制形式存储没有符号位全部位都用于表示数值。
现在来分析源程序中的变量及其对应的十进制真值以及扩展操作方式 1.1. short si -32768; • si 是一个有符号短整型变量占用2个字节16位。 • 十进制真值-32768。 • 扩展操作方式将-32768直接存储到 si 中不需要进行扩展操作。
1.2. unsigned short usi si; • usi 是一个无符号短整型变量占用2个字节16位。 • 十进制真值32768。 • 扩展操作方式将 si 的二进制补码表示直接转换为无符号数的二进制表示。
1.3. int i si; • i 是一个有符号整型变量占用4个字节32位。 • 十进制真值-32768。 • 扩展操作方式由于 si 是一个有符号短整型变量它的扩展操作是将其符号位扩展到更高位即复制符号位直到填满 i 的所有位。
1.4. unsigned ui usi; • ui 是一个无符号整型变量占用4个字节32位。 • 十进制真值32768。 • 扩展操作方式将 usi 的二进制表示直接转换为无符号整数的二进制表示。 综上所述无符号数和带符号整数的扩展操作方式是不同的。无符号数直接将二进制表示转换为目标类型而带符号整数需要进行符号位的扩展操作。
2编写程序说明不同数据类型之间进行转换时在表数范围和精度上的变化。
2.1. 给定一个short型数据 -12345分别转换为int、unsigned short、unsigned int、float类型的数据
#include stdio.h
int main() {short s -12345;int i s;printf(s as int: %d\n, i);unsigned short us (unsigned short)s;printf(s as unsigned short: %u\n, us);unsigned int ui (unsigned int)s;printf(s as unsigned int: %u\n, ui);float f (float)s;printf(s as float: %f\n, f);return 0;
}由于short类型是有符号的而unsigned short和unsigned int都是无符号的因此s转换为unsigned short和unsigned int时会被解释为一个很大的正整数
在进行float类型的转换时系统会将short类型的值转换为float类型的值并在其末尾添加一些额外的零以使其符合float类型的规格化格式。
2.2. 给定一个int型数据2147483647分别转换为short、unsigned short、unsigned int、float、double类型的数据
#include stdio.h
int main() {int i 2147483647;short s (short)i;printf(i as short: %d\n, s);unsigned short us (unsigned short)i;printf(i as unsigned short: %u\n, us);unsigned int ui (unsigned int)i;printf(i as unsigned int: %u\n, ui);float f (float)i;printf(i as float: %f\n, f);double d (double)i;printf(i as double: %lf\n, d);return 0;
}在32位系统中int类型占据4个字节范围为-2147483648到2147483647。 当将最大值2147483647转换为short类型时超出了short类型的范围导致截断结果为-1。 当将最大值2147483647转换为unsigned short类型时超出了unsigned short类型的范围结果为65535。 当将最大值2147483647转换为unsigned int类型时结果仍然是2147483647因为unsigned int类型足够存储这个数值。 当将最大值2147483647转换为float类型时由于float类型的精度限制整数部分超过了可表示的范围结果变为2147483648.000000。 当将最大值2147483647转换为double类型时double类型的精度比float更高能够保持原始值。
2.3.给定一个float型数据123456.789e5转换成int、double型数据
#include stdio.h
int main() {float f 123456.789e5;int i (int)f;printf(f as int: %d\n, i);double d (double)f;printf(f as double: %lf\n, d);return 0;
}在32位机器上int类型占据4个字节范围为-2147483648到2147483647。而变量f的值为123456.789e5即123456.789乘以10的5次方结果为12345678900。 当将float类型的变量f转换为int类型时会发生截断操作。由于整数部分超过了int类型的范围截断结果为-2147483648即int类型的最小值。 当将float类型的变量f转换为double类型时由于double类型的精度比float更高能够准确表示变量f的值。因此结果为12345679104.000000。
2.4.给定一个double型数据123456.789e5转换成int、float型数据。#include stdio.h
int main() {double d 123456.789e5;int i (int)d;printf(d as int: %d\n, i);float f (float)d;printf(d as float: %f\n, f);return 0;
}在32位机器上int类型占据4个字节范围为-2147483648到2147483647。而变量d的值为123456.789e5即123456.789乘以10的5次方结果为12345678900。 当将double类型的变量d转换为int类型时会发生截断操作。由于整数部分超过了int类型的范围截断结果为2147483647即int类型的最大值。 当将double类型的变量d转换为float类型时由于float类型的精度较低无法完全保留double类型的精度。因此结果为12345679232.000000存在舍入误差。
根据实验结果回答下列问题
1补码整数如int型数是否总能转换为等值的float类型数据为什么
补码整数如int型数并不总能转换为等值的float类型数据。这是因为在转换过程中如果整数部分过大或者过小超出了float类型能表示的范围就会发生精度丢失或者溢出的情况。例如在32位机器上int类型范围为-2147483648到2147483647而float类型的有效范围约为±3.4e±38当int型数据超出了这个范围时就无法准确表示为对应的float类型数据。
2float型数据是否总能转换成等值的double型数据为什么
float型数据并不总能转换成等值的double型数据。虽然float和double都表示浮点数但是double类型具有更高的精度和表示范围。因此当一个float类型数据转换为double类型时会出现精度损失的情况因为double类型无法准确表示所有的float类型数据特别是对于较大或较小的浮点数。
3长数被截断成短数后可能发生什么现象为什么
将长数截断为短数后可能发生精度丢失或溢出的现象。例如将一个较大的double类型数据截断为float类型或者将一个int类型数据赋给short类型变量都可能导致数据溢出或者精度丢失。这是因为短数类型能够表示的范围和精度比长数类型更小所以超出范围的部分会被截断或者舍入导致数据的改变。
3.编程计算下列表达式的值
3.1. unsigned int型数据 142949672951-4294967295
#include stdio.hint main() {unsigned int x 1;unsigned int y 4294967295;// 1 4294967295unsigned int sum x y;printf(1 4294967295 %u (0x%x)\n, sum, sum);// 1 - 4294967295unsigned int diff x - y;printf(1 - 4294967295 %u (0x%x)\n, diff, diff);return 0;
}对于第一个表达式unsigned int类型的数据是无符号数范围为0到4294967295。由于1加上4294967295等于4294967296超出了unsigned int类型的表示范围因此结果为0。对于无符号数来说溢出后会自动回绕即4294967296等于0。对于第二个表达式1减去4294967295的结果为2。同样地由于unsigned int类型是循环的4294967295减去1实际上等于2。
3.2. int型数据21474836471-2147483648-1
#include stdio.hint main() {int a 2147483647;int b 1;int c -2147483648;int d -1;// 2147483647 1int sum a b;printf(2147483647 1 %d (0x%x)\n, sum, sum);// -2147483648 - 1int diff c - d;printf(-2147483648 - 1 %d (0x%x)\n, diff, diff);return 0;
}对于第一个表达式int类型的数据是有符号数范围为-2147483648到2147483647。由于2147483647加上1等于2147483648超出了int类型的表示范围因此结果为-2147483648。这是因为在有符号整数中溢出会导致“环绕”现象。对于第二个表达式-2147483648减去1的结果为2147483647。由于-1的补码为0xffffffff将-2147483648减去1相当于对-2147483648取反后加1得到的就是2147483647。