为什么我们需要带上类型后缀?U/UL/ULL/L/LL

article/2025/9/18 14:00:15

类型后缀

给变量赋值的时候分两个阶段。
第一步,如果没有指定字面量的类型,C99会找到一个能容纳字面量值的最小的带符号类型(int / long int / long long int)。
第二步,转换成左边变量类型并赋值。

long i = 0xffff; //   0xffffffffffff
long j = 0xffffU; //  0x00000000ffff
long k = 0xffffUL; // 0x00000000ffff

在下面几种场景里,我们需要显式指定字面量的类型来避免问题。

  • 未定义的行为
printf("%lld", 1LL); // correct, because 1LL has type long long
printf("%lld", 1);   // undefined behavior, because 1 has type int
  • 防止溢出
    在这里插入图片描述
long x = 10000000L * 4096L;
  • 移位操作
unsigned long long y = 1ULL << 36;

如前所述,赋值操作在后,数值计算在前,因此只把等号左边的变量声明成较长的数据类型是不足矣防止计算溢出的。

在这里插入图片描述
可以看到只有正确类型的类型声明,才能避免移位结果溢出。
在这里插入图片描述

  • 数值比较
    在数值比较时,我们应当指定数据类型。
int x = -1;
printf("%d\n", x < 12); // prints 1 because it's true that -1 < 12int x = -1;
printf("%d\n", x < 12U); // prints 0 because (unsigned int)-1 is large

编译过程中编译器会给出大量的告警提示信息来帮助我们避免一些未定义的行为和后期难以发现的 bug。

我们要对这些行为做到心中有数,因为有些潜藏的错误编译器无法识别出来。我们来看下面这个错误,预期高32bits全是0,实际上生成的代码做了符号扩展,最终结果高32bits全为1,这明显和我们的意图是不一致的。

在这里插入图片描述

关于移位操作,可以参考下 Linux 是如何用相关的宏来防止类似的问题的。

// ./include/uapi/linux/const.h
...
#ifdef __ASSEMBLY__
#define _AC(X,Y)	X
#define _AT(T,X)	X
#else
#define __AC(X,Y)	(X##Y)
#define _AC(X,Y)	__AC(X,Y)
#define _AT(T,X)	((T)(X))
#endif#define _UL(x)		(_AC(x, UL))
#define _ULL(x)		(_AC(x, ULL))#define _BITUL(x)	(_UL(1) << (x))
#define _BITULL(x)	(_ULL(1) << (x))
...// ./include/vdso/const.h
#include <uapi/linux/const.h>#define UL(x)		(_UL(x))
#define ULL(x)		(_ULL(x))// 类似的,也有位域的定义方式
...
#define BIT(nr)			(UL(1) << (nr))

读者可能会问,为什么不直接在数值上带上后缀而要引入这些宏呢?原因是汇编代码不识别后缀,这些宏是为了能让相关的代码能够在C代码和汇编代码中都使用而引入的。


http://chatgpt.dhexx.cn/article/uIYCja9j.shtml

相关文章

IMX6ULL与IMX6UL异同(主要是优化了其成本:安全功能减低,优化功耗EMC SIM模块删除等与但和I.MX6UltraLite芯片是PIN-2-PIN兼容的)

I.MX6ULL相对于I.MX6UltraLite来说&#xff0c;主要是优化了其成本。与I.MX6UltraLite芯片是PIN-2-PIN兼容的&#xff0c;使的I.MX6ULL很容易在IMX6UL上重用&#xff0c;主要更改如下。 1. 增加了EPD显示支持与EPDC/PXP的低端电子阅读器&#xff0c;相对于6sl7d系列也是一个低…

论文阅读笔记(1)——《Ultra-Low Latency (ULL) Networks: The IEEE TSN and IETF DetNet Standards and Related 5G》

《超低延迟 (ULL) 网络&#xff1a;IEEE TSN 和 IETF DetNet 标准及相关 5G ULL 研究》 DOI&#xff1a;10.1109/COMST.2018.2869350 前言 IEEE 802.1 时间敏感网络 (TSN) 标准和相关研究旨在为 ULL 网络提供链路层支持&#xff0c;而新兴的 IETF 确定性网络 (DetNet) 标准则…

机器学习十大算法简介

本文对机器学习的常用算法进行常识性的认识&#xff0c;介绍这些算法是什么以及如何应用&#xff08;主要是针对分类问题&#xff09;以及对单个算法的理解的简介。本文要介绍的十大算法如下&#xff1a;①决策树&#xff1b;②随机森林&#xff1b;③逻辑回归&#xff1b;④SV…

常见的机器学习算法与人工神经网络

目录 1. 邻近算法K-NearesNeighbor (KNN) 1.1 KNN算法核心思想 1.2 KNN算法步骤 1.3 KNN预测分类 2. 图神经网络Graph Neural Networks (GNN) 2.1图的基本定义 2.2 图神经网络模型 3. 卷积神经网络Convolutional Neural Network (CNN) 3.1 CNN的结构 3.2 卷积 3.3 卷…

【KELM预测】基于粒子群算法改进核极限学习机(KELM)分类算法 matlab源码

一、核极限学习机 本文将介绍一种新的SLFN的算法&#xff0c;极限学习机&#xff0c;该算法将随机产生输入层和隐含层间的连接权值和隐含层神经元的阈值&#xff0c;且在训练过程中无需调整&#xff0c;只需要设置隐含层的神经元的个数&#xff0c;便可以获得唯一最优解&#x…

机器学习算法[9]--集成方法之XGBoost原理详解及XGBoost库实现

机器学习 1. XGBoost1.1 原理1.1.1 算法解析1.1.2 算法流程 1.2 XGBoost库实现 1. XGBoost 1.1 原理 XGBoost(Extreme Gradient Boosting)通过串行的方式迭代训练多个相互依赖的决策树回归模型&#xff0c;最后综合多个简单模型共同作用产生输出&#xff0c;在GBDT作出全面优…

基于PSO优化的SVM数据预测算法matlab仿真

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整MATLAB 1.算法仿真效果 matlab2022a仿真结果如下&#xff1a; 2.算法涉及理论知识概要 支持向量机&#xff08;support vector machines, SVM&#xff09;是二分类算法&#xff0c;所谓二分类即把具有…

基于改进大洪水算法求解TSP问题

from function import get_distances, get_value, result_plot, get_neighbors from random import randintdef r_opt(route):"""利用2-opt算法对route进行改进,对当前路径所有不相邻的两点进行边边交换"""new_route route[:]value get_value(…

粒子群算法介绍

优化算法——粒子群优化介绍 1. 基本概念 粒子群优化算法(PSO&#xff1a;Particle swarm optimization) 是一种进化计算技术&#xff08;evolutionary computation&#xff09;。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想&#xff1a;是通过群体中个体之间的协作…

Python实现VRP常见求解算法——离散量子行为粒子群算法(DQPSO)

基于python语言&#xff0c;实现经典离散量子行为粒子群算法&#xff08;DQPSO&#xff09;对车辆路径规划问题&#xff08;CVRP&#xff09;进行求解。 目录 优质资源1. 适用场景2. 求解效果3. 问题分析4. 数据格式5. 分步实现6. 完整代码参考 优质资源 python实现6种智能算法…

回归预测 | MATLAB实现基于QPSO-BiLSTM、PSO-BiLSTM、BiLSTM多输入单输出回归预测

回归预测 | MATLAB实现基于QPSO-BiLSTM、PSO-BiLSTM、BiLSTM多输入单输出回归预测 目录 回归预测 | MATLAB实现基于QPSO-BiLSTM、PSO-BiLSTM、BiLSTM多输入单输出回归预测效果一览基本描述程序设计参考资料 效果一览 基本描述 1.Matlab实现QPSO-BiLSTM、PSO-BiLSTM、BiLSTM神经…

云模型量子粒子群算法

云模型量子粒子群算法 量子粒子群推导过程&#xff1a; 量子粒子群算法(Quantum-behaved Particle Swarm Optimization&#xff0c;QPSO)具有进化方程简单、控制参数少、收敛速度快、运算量少等特点。QPSO从量子动力学运动方程出发&#xff0c;通过蒙特卡洛逆变换法定格某时刻…

【配电网重构】基于粒子群算法求解配电网重构问题附matlab代码

1 内容介绍 随着大规模,跨区域的配电网不断发展,对配电网运行的经济性和可靠性要求越来越高,在配电网发生大范围停电事故后,需要对配电网的拓扑结构进行重新组合,从而达到恢复供电的目的,这个重新组合配电网拓扑结构的过程即为配电网恢复重构.配电网恢复重构是一个多目标非线性…

回归预测 | MATLAB实现基于QPSO-GRU、PSO-GRU、GRU多变量回归预测

回归预测 | MATLAB实现基于QPSO-GRU、PSO-GRU、GRU多变量回归预测 目录 回归预测 | MATLAB实现基于QPSO-GRU、PSO-GRU、GRU多变量回归预测效果一览基本描述程序设计参考资料 效果一览 基本描述 1.Matlab实现QPSO-GRU、PSO-GRU和GRU门控循环单元多变量回归预测&#xff1b; 2.输…

回归预测 | MATLAB实现基于QPSO-BiGRU、PSO-BiGRU、BiGRU多变量回归预测

回归预测 | MATLAB实现基于QPSO-BiGRU、PSO-BiGRU、BiGRU多变量回归预测 目录 回归预测 | MATLAB实现基于QPSO-BiGRU、PSO-BiGRU、BiGRU多变量回归预测效果一览基本描述程序设计参考资料 效果一览 基本描述 1.Matlab实现QPSO-BiGRU、PSO-BiGRU和BiGRU双向门控循环单元多变量回归…

QPSO---收缩扩张系数的选择方案(未完待续)

一、理论基础 平均最优位置&#xff1a; 其中,P代表第i个粒子的最优位置&#xff0c;即局部最优位置&#xff0c;mbest为平均最优位置。对于多维粒子而言&#xff0c;每一维上的最优位置等于全部粒子在该维度上的平均值。 其中小写的p代表每个粒子的局部吸引子&#xff0c;它的…

组合预测模型 | 基于QPSO-LSTM、PSO-LSTM、LSTM单输入单输出时序预测(Matlab程序)

组合预测模型 | 基于QPSO-LSTM、PSO-LSTM、LSTM单输入单输出时序预测(Matlab程序) 目录 组合预测模型 | 基于QPSO-LSTM、PSO-LSTM、LSTM单输入单输出时序预测(Matlab程序)预测结果基本介绍程序设计参考资料预测结果

时序预测 | MATLAB实现基于QPSO-GRU、PSO-GRU、GRU时间序列预测

时序预测 | MATLAB实现基于QPSO-GRU、PSO-GRU、GRU时间序列预测 目录 时序预测 | MATLAB实现基于QPSO-GRU、PSO-GRU、GRU时间序列预测效果一览基本描述程序设计参考资料 效果一览 基本描述 MATLAB实现基于QPSO-GRU、PSO-GRU、GRU时间序列预测。 1.Matlab实现QPSO-GRU、PSO-GRUG…

时序预测 | MATLAB实现基于QPSO-LSTM、PSO-LSTM、LSTM时间序列预测

时序预测 | MATLAB实现基于QPSO-LSTM、PSO-LSTM、LSTM时间序列预测 目录 时序预测 | MATLAB实现基于QPSO-LSTM、PSO-LSTM、LSTM时间序列预测效果一览基本描述程序设计参考资料 效果一览 基本描述 MATLAB实现基于QPSO-LSTM、PSO-LSTM、LSTM时间序列预测。 1.Matlab实现QPSO-LSTM…

回归预测 | MATLAB实现基于QPSO-LSTM、PSO-LSTM、LSTM多输入单输出回归预测

回归预测 | MATLAB实现基于QPSO-LSTM、PSO-LSTM、LSTM多输入单输出回归预测 目录 回归预测 | MATLAB实现基于QPSO-LSTM、PSO-LSTM、LSTM多输入单输出回归预测效果一览基本描述模型描述程序设计参考资料 效果一览 基本描述 1.Matlab实现QPSO-LSTM、PSO-LSTM和LSTM神经网络时间序…