ASCII字符14(和其他),当在c中赋值为字符串时



在GDB中调试以下代码:

char* input = malloc(2);
input[0] = 14;
input[1] = 0;

根据GDB,该字符串在内存中的值为:

input = "16"

同样,

char* input = malloc(2);
input[0] = 16;
input[1] = 0;

内存输入为"20"

为什么会这样?为什么ASCII值14不映射到字符16?那么,为什么ASCII值16映射到内存中的20?

编辑:为了增加更多的混乱,使用以下代码:

char* input = malloc(2);
input[0] = 20;
input[1] = 0;

通过在gdb中运行上述代码段并使用以下命令:

p input

输出的结果值是:

$1 = 0x604010 "20"

这让我相信字符串输入的值是"20"

两个ASCII数字对应相同的内容"20"(即16和20)。

14写成八进制(以8为基数)的016。语法'16'由于历史原因使用八进制,即60年代的古董计算机将6位字符塞进12位,18位甚至36位单词中,因此八进制数字似乎是3位组的完美表示。

可以在C语法中的字符和字符串常量(许多语言从C语言中借用)和Unix文件系统中的权限标志(例如:chmodumask参数)中找到这些痕迹。

16'20',20'24',32(ASCII空格)为'40''x20'

记录16表示一个八进制转义序列。其十进制值等于14

来自C标准(6.4.4.4字符常量)

octal-escape-sequence:
 octal-digit
 octal-digit octal-digit
 octal-digit octal-digit octal-digit

编译器也可以将该值表示为十六进制转义序列,如xE

这个八进制转义序列20表示十进制数16。数字20写成八进制转义序列将会是24

最新更新