c - C中字符常量的值
问题描述
6.4.4.4/10 ...如果整数字符常量包含单个字符或转义序列,则其值是将具有单个字符或转义序列的值的 char 类型的对象转换为 int 类型时产生的值.
我很难理解这一段。本段标准后给出如下示例:
示例 2:考虑使用二进制补码表示整数和 8 位表示类型为 char 的对象的实现。在 char 类型的值范围与有符号 char 相同的实现中,整数字符常量 '\xFF' 的值为 -1;如果 char 类型的值范围与 unsigned char 相同,则字符常量 '\xFF' 的值是 +255。
我从表达式中了解到:“char 类型的对象的值”是我们在解释 char 类型的对象内容时得到的值。但是当我们看这个例子时,就像用纯二进制符号谈论对象的值一样。我的理解错了吗?对象的值是否总是意味着该对象中的位?
解决方案
所有“整数字符常量”(和之间的东西'
)'
都具有int
传统和兼容性原因的类型。但它们大多是和 一起使用的char
,所以 6.4.4.4/10 需要区分类型。基本上修补损坏的 C 语言 - 我们有诸如*"\xFF"
导致 typechar
但'\xFF'
导致 type 的情况int
,这非常令人困惑。
值'\xFF'
= 255 将始终适合int
任何实现,但不一定适合char
具有实现定义的符号(语言中的另一个不一致)的 a 。转义序列的行为应该就像我们将字符常量存储在 achar
中一样,就像在我的字符串文字示例中所做的那样*"\xFF"
。
char
即使值存储在 an中,也需要与类型保持一致,这int
是 6.4.4.4/10 所描述的。也就是说,printf("%d", '\xFF');
应该表现得像char ch = 255; printf("%d", (int)ch);
该示例描述了一种可能的实现,其中char
有符号或无符号并且系统使用 2 的补码。通常整数类型的对象的值是指十进制表示法。char
是一个整数类型,所以它可以有一个负十进制值(如果符号表有一个与值 -1 匹配的索引是另一回事)。但是“原始二进制”不能有负值,1111 1111
如果你说存储单元应该被解释为8位2的补码,只能说是-1。也就是说,如果您知道签名char
存储在那里。如果您知道char
那里存储了一个无符号数,则该值为 255。
推荐阅读
- azure - 带有 Azure SQL 数据库的 Xamarin-Forms 移动应用程序
- javascript - 我正在尝试将动画添加到 Javascript 但不确定在哪里
- c# - 在 C# 中删除锁定的文件
- c# - 如何使用回调在c#中通过接口发送已发布的消息
- c++ - C++ 循环终止条件
- font-awesome - FontAwsome 和文本对齐
- eclipse - 在 SVN Eclipse 中,“Update to head”危险吗?
- oracle - Oracle SQL - 使用所需的不同列来透视列
- node.js - Node JS - 检查 JSON 文件是否具有嵌套元素
- r - 在 r 的数据框中收集相同的年份?