当前位置:网站首页>C专家编程 第1章 C:穿越时空的迷雾 1.10 “安静的改变”究竟有多少安静
C专家编程 第1章 C:穿越时空的迷雾 1.10 “安静的改变”究竟有多少安静
2022-08-03 16:09:00 【weixin_客子光阴】
/*1.10 "安静的改变"究竟有多少安静*/
/*目的是使C语言更加可靠*/
/*算术转换(K&R C)
*操作数 转换类型
*寻常算术转换(usual arithmetic conversion)
*操作数为char或short会转变成int
*操作数为float会转变成double
*首先,其中一个操作数为double,其他类型会转换成double,结果类型也为double(优先级较高)
*其次,其中一个操作数为long,其他类型会转换成long,结果类型也为long类型
*最后,其中一个操作数为unsigned,其他类型会转换成unsigned, 结果类型为unsigned类型
*其他情况,如果两个操作数的类型都为int,计算结果的类型也是int
*/
/*算术转换(ANSI C)
*字符和整型(整型升级)
*char、short int或者int型位段(bit-field),包括它们的有符号或无符号变体,以及枚举
*类型,可以使用在需要int或unsigned int的表达式中。如果int可以完整表示源类型的所有值
*那么该源类型的值就被转换为int,否则转换为unsigned int。这称为整型升级。
*寻常算术转换
*许多操作数类型为算术类型的双目会引发转换,并以类似的方式产生结果类型。
*它的目的是产生一个普通类型,同时也是结果的类型。这个模式称为“寻常算术转换”
*首先,一个操作数类型为long double,另一个操作数类型也被转换成long double
*其次,一个操作数类型为double, 另一个操作数类型也被转换成double
*最后,一个操作数类型为float, 另一个操作数类型也被转换成float
*否则,两个操作数进行整型升级,并执行下面的规则
*如果其中一个操作数的类型为unsigned long int, 那么另一个操作数也被转换成unsigned
*long int。其次,如果其中一个操作数的类型为long int, 而另一个操作数类型是unsigned int,
*如果long int能够完整表示unsigned int的所有值,那么unsigned int类型操作数被转换成long int;
*如果long int不能完整表示unsigned int的所有值,那么两个操作数都被转换成unsigned long int.
*再次,如果其中一个操作数的类型为long int, 那么另一个操作数被转换为long int。
*最后,如果其中一个操作数的类型是unsigned int, 那么另一个操作数也被转换成unsigned int.
*如果所有以上情况都不属于,那么两个操作数都为int。
*浮点操作数和浮点表达式的值可以用比类型本身所要求的更大的精度和更广的范围来表示,而它
*的类型并不因此改变。
*/
/*ANSI C标准所表示的意思大致如下:
*当执行算术运算时,操作数的类型如果不同,就会发生转换。数据类型一般朝着浮点精度更高,
*长度更长的方向转换。整型数如果转换为signed不会丢失信息,就转换为signed,否则转换为
*unsigned。
*/
/*K&R C采用无符号保留(unsigned preserving)原则,就是当一个无符号类型与int或者更小的整型混合使用时,结果类型为无符号类型。
*ANSI C标准采用值保留(value preserving)原则,就是当把几个整型操作数混合使用时(如下面的程序所示),结果类型既有可能是有符号数,也可能是无符号数,具体取决于操作数的类型的
相对大小。
*/
#include <stdio.h>
int main( void ){
if( 1u - 2 >= 0 ){
printf( "the result of unsigned int number substract signed int number is larger than or equal to zero" );
} else{
printf( "the result of unsigned int number substract signed int number is smaller than zero" );
}
return 0;
}
/* 输出:
*/
#include<stdio.h>
int main() {
if (-1 < (unsigned char) 1) { //equivalent to (int)-1 < (int)1
printf("-1 is less than (unsigned char)1: ANSI semantics");
} else { //equivalent to (unsigned int)(-1) < (unsigned int)1
printf("-1 NOT less than (unsigned char)1: K&R semantics");
}
return 0;
}
/* 输出:
*/
程序中的表达式在两种编译器下的编译器结果不同。-1的位模式是一样的,但一个编译器(ANSI C)将它解释为负数,另一个编译器(K&R C)却将它解释为无符号数,也就是变成了正数。
/*软件信条*/
#include <stdio.h>
int array[] = {23, 34, 12, 17, 204, 99, 16};
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) //无符号整数(unsigned int)
int main() {
int d = -1, x;
// /*...*/
//error equivalent to (unsigned int)d <= (unsigned int)TOTAL_ELEMENTS - 2
if (d <= TOTAL_ELEMENTS - 2) {
x = array[d + 1];
}
// /*...*/
//correct //equivalent to (int)d <= (int)TOTAL_ELEMENTS - 2
if (d <= (int)TOTAL_ELEMENTS - 2) {
x = array[d + 1];
}
}
/*
*#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
*#define TOTAL_ELEMENTS (sizeof(array) / sizeof(int))
*因为前者可以在不修改#define语句的情况下改变数组的基本类型。
*/
/*无符号类型的建议*/
/*尽量不要在代码中使用无符号类型,以免增加不必要的复杂性。尤其是不要仅仅因为无符号
*不存在负值(如年龄、国债)就用它来表示数量
*尽管使用像int那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界
*情况(如-1被翻译为非常大的正数)。
*只有在使用位段和二进制掩码时,才可以使用无符号数。
*应该在表达式中使用强制类型转换,使操作数均为有符号数
*或者无符号数,这样不必由编译器来选择结果的类型
*/
边栏推荐
- Leetcode76. 最小覆盖子串
- 如何设计大电流九线导电滑环
- uniapp隐藏导航栏和横屏显示设置
- Hannah荣获第六季完美童模全球总决赛全球人气总冠军
- 详谈RDMA技术原理和三种实现方式
- Analysis of ffplay video playback principle
- Kubernetes 笔记 / 任务 / 管理集群 / 用 kubeadm 管理集群 / 配置一个 cgroup 驱动
- Not to be ignored!Features and advantages of outdoor LED display
- MPLS的wpn实验
- 【There is no tracking information for the current branch. Please specify which branch you want to 】
猜你喜欢
用友YonSuite与旺店通数据集成对接-技术篇2
MySQL窗口函数
vector类
DataGrip数据仓库工具
带你了解什么是 Web3.0
Common distributed theories (CAP, BASE) and consensus protocols (Gosssip, Raft)
Not to be ignored!Features and advantages of outdoor LED display
一文看懂推荐系统:概要02:推荐系统的链路,从召回粗排,到精排,到重排,最终推荐展示给用户
AI+BI+可视化,Sugar BI架构深度剖析
[微信小程序开发者工具] × #initialize
随机推荐
【无标题】
Hannah荣获第六季完美童模全球总决赛全球人气总冠军
vector类
ffplay视频播放原理分析
Common distributed theories (CAP, BASE) and consensus protocols (Gosssip, Raft)
MATLAB | 七夕节快到了,还不给朋友安排上这个咕呱小青蛙?
视频人脸识别和图片人脸识别的关系
leetcode:202. 快乐数
C语言01、数据类型、变量常量、字符串、转义字符、注释
Web3 安全风险令人生畏?应该如何应对?
简易网络传输方法
WordPress建站技术笔记
Leetcode76. Minimal Covering Substring
请问大家,MySQL全量怎么样可以提高性能呢?我这里瓶颈是在Source上,在不增加并行度的情况下,
移动应用出海,你的“网络优化”拖后腿了吗?
元宇宙系列--Value creation in the metaverse
WordPress 5.2.3 更新,升级出现请求超时的解决方法
想进阿里?先来搞懂一下分布式事务
ReentrantLock详解
[微信小程序开发者工具] × #initialize