在C中,如果我想要一个浮点文字x是十六进制形式并且具有指数值,它将表示为:
float x = 0X2aE+10;
Run Code Online (Sandbox Code Playgroud)
其中0x用于表示十六进制,而2a表示十六进制字符,而E + 10表示数字十进制为十进制.但是,编译器是否知道它不是2aE表示十六进制数字(因为十六进制使用a到e为10-15)而+10只是在数字上加十?如果没有,那修复的是什么?
chq*_*lie 16
0X2aE+10是一个有效的预处理程序标记,它不会转换为有效的C标记,因此编译错误.C99十六进制浮点数使用P或p作为指数标记,如:
float x = 0X2aP+10;
Run Code Online (Sandbox Code Playgroud)
哪个有价值0x2a * 1024- > 43008.
对于那些不了解预处理数字的人:
6.4.8预处理数字
句法
Run Code Online (Sandbox Code Playgroud)pp-number: digit . digit pp-number digit pp-number identifier-nondigit pp-number e sign pp-number E sign pp-number p sign pp-number P sign pp-number .描述
甲预处理号码以任选地被一个句点(.)前面的一个数字,并且可以随后有效的标识符的字符和字符序列
e+,e-,E+,E-,p+,p-,P+,或P-.词法上预处理数字标记包括所有浮点和整数常量标记.
语义
预处理号码没有类型或值; 它在成功转换(作为转换阶段7的一部分)之后获取浮动常量令牌或整数常量令牌.
如果您看到例如此浮点文字引用,您将看到十六进制浮点值需要p或中P缀来表示指数.
所以定义应该是这样的
float x = 0X2ap10;
Run Code Online (Sandbox Code Playgroud)
Hex浮点数p用作指数标记:
float x = 0x2ap+10;
Run Code Online (Sandbox Code Playgroud)
不过,这实际上是一个double价值.如果你想要一个float文字,你需要一个f后缀:
float x = 0x2ap+10f;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
471 次 |
| 最近记录: |