使用八进制表示 ASCII 的目的
Purpose of using octal for ASCII
为什么 C 程序员会对 ASCII 值而不是十进制值使用转义序列 (oct/hex)?
跟进:这与性能或便携性有关吗?
示例:
char c = '5';
您使用八进制或十六进制是因为无法在字符文字或字符串文字中指定十进制代码。八进制在 PDP-11 代码中很普遍。现在,使用十六进制可能更有意义,尽管 '[=10=]'
比 '\x0'
更紧凑(因此当您用 null 终止字符串等时使用 '[=10=]'
)。
此外,请注意 "\x0ABad choice"
没有您可能期望的含义,而 "2007 wins"
可能有。 (不同之处在于,十六进制转义会一直运行,直到遇到非十六进制数字,而八进制转义最多会在 3 位数字后停止。要获得预期结果,您需要 "\x0A" "Bad choice"
使用 'adjacent string literal concatenation'.)
这与性能无关,与可移植性无关。写 '\x41'
或 '1'
而不是 'A'
是降低代码的可移植性和可读性的一种方式。只有在没有更好的方式来表示字符时,才应考虑使用转义序列。
不,它与性能和便携性没有任何关系。这只是定义字符文字和专门用于不可打印字符的字符串文字的一种便捷方式。
它与性能和便携性无关。事实上,你根本不需要任何代码,取而代之的是:
char c = 65;
你可以简单地写:
char c = 'A';
但有些字符并不那么容易输入,例如ASCII SOH,所以你可以这样写:
char c = 1; // SOH
或任何其他形式,十六进制,八进制,取决于您的喜好。
它与性能和便携性无关。很简单,ASCII 字符集(以及它直到 UTF 的派生字符)是以字节和位组织的。例如前32个字符为控制字符,32=040=0x20,'A'的ASCII码为65=0101=0x41,'a'为97=0141=0x61,ASCII码为'0 ' 是 48 = 060 = 0x30.
我不知道对你来说,但对我来说,'0x30' 和 0x'41' 比 48 和 65 更容易记住和在手动操作中使用。
顺便说一下,一个字节正好代表 0 到 255 之间的所有值,即 0 到 0xFF ...
我不知道这行得通。
但我立即想到了一个非常有用的想法。
假设你有一个低内存环境并且必须使用像 unix 文件夹权限这样的权限系统。
假设有 3 个组,每个组有 2 个不同的选项,可以允许或拒绝。
0表示两个选项中的none,
1表示允许第一个选项,
2 表示允许第二个选项并且
3 表示都允许。
要存储权限,您可以这样做:
char* bar = "213"; // first group has allowed second option, second group has first option allowed and third has full acces.
但是您有四个字节存储该信息。
当然,您可以将其转换为十进制表示法。但这可读性较差。
但据我所知....
正在做:
char bar = '13';
可读性强,还节省内存!
我喜欢它:D
为什么 C 程序员会对 ASCII 值而不是十进制值使用转义序列 (oct/hex)?
跟进:这与性能或便携性有关吗?
示例:
char c = '5';
您使用八进制或十六进制是因为无法在字符文字或字符串文字中指定十进制代码。八进制在 PDP-11 代码中很普遍。现在,使用十六进制可能更有意义,尽管 '[=10=]'
比 '\x0'
更紧凑(因此当您用 null 终止字符串等时使用 '[=10=]'
)。
此外,请注意 "\x0ABad choice"
没有您可能期望的含义,而 "2007 wins"
可能有。 (不同之处在于,十六进制转义会一直运行,直到遇到非十六进制数字,而八进制转义最多会在 3 位数字后停止。要获得预期结果,您需要 "\x0A" "Bad choice"
使用 'adjacent string literal concatenation'.)
这与性能无关,与可移植性无关。写 '\x41'
或 '1'
而不是 'A'
是降低代码的可移植性和可读性的一种方式。只有在没有更好的方式来表示字符时,才应考虑使用转义序列。
不,它与性能和便携性没有任何关系。这只是定义字符文字和专门用于不可打印字符的字符串文字的一种便捷方式。
它与性能和便携性无关。事实上,你根本不需要任何代码,取而代之的是:
char c = 65;
你可以简单地写:
char c = 'A';
但有些字符并不那么容易输入,例如ASCII SOH,所以你可以这样写:
char c = 1; // SOH
或任何其他形式,十六进制,八进制,取决于您的喜好。
它与性能和便携性无关。很简单,ASCII 字符集(以及它直到 UTF 的派生字符)是以字节和位组织的。例如前32个字符为控制字符,32=040=0x20,'A'的ASCII码为65=0101=0x41,'a'为97=0141=0x61,ASCII码为'0 ' 是 48 = 060 = 0x30.
我不知道对你来说,但对我来说,'0x30' 和 0x'41' 比 48 和 65 更容易记住和在手动操作中使用。
顺便说一下,一个字节正好代表 0 到 255 之间的所有值,即 0 到 0xFF ...
我不知道这行得通。
但我立即想到了一个非常有用的想法。
假设你有一个低内存环境并且必须使用像 unix 文件夹权限这样的权限系统。
假设有 3 个组,每个组有 2 个不同的选项,可以允许或拒绝。
0表示两个选项中的none,
1表示允许第一个选项,
2 表示允许第二个选项并且
3 表示都允许。
要存储权限,您可以这样做:
char* bar = "213"; // first group has allowed second option, second group has first option allowed and third has full acces.
但是您有四个字节存储该信息。
当然,您可以将其转换为十进制表示法。但这可读性较差。
但据我所知....
正在做:
char bar = '13';
可读性强,还节省内存! 我喜欢它:D