你不会了解 发表于 2021-11-5 12:11

C语言中char类型的数据'abc'、'\abc'、'\a\bc'三个的值为什么会这样?

本帖最后由 你不会了解 于 2021-11-5 14:58 编辑

#include <stdio.h>

int main(void)
{
        char ch1 = 'abc';
        char ch2 = '\abc';
        char ch3 = '\a\bc';

        printf("%c %d\n", ch1, ch1);        // c        99
        printf("%c %d\n", ch2, ch2);        // c        99
        printf("%c %d\n", ch3, ch3);        //      7}

上述三个变量,ch1和ch2分别保存的是c的二进制值

我理解的是,这两变量按小端模式存储,实际要反着来

如'cba','cb\a',又因char只能存一个字节,所以保存的是c

但是为什么ch3保存的是\a的值,也就是7,为什么?

xinyu010 发表于 2021-11-5 13:16

在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示 。

god4 发表于 2021-11-5 13:29

字节串,。。

mzq123000 发表于 2021-11-5 13:59

\a的含义是警报,对应的ASCII码值是007

PirateMan 发表于 2021-11-5 14:05

至于大端和小端和CPU有关   只能保存一个字节    对应的是ASCII码

weakptr 发表于 2021-11-5 14:08

https://en.cppreference.com/w/cpp/language/character_literal

针对你的问题:
1,多字符的char字面量('abc'),储存类型是`int`,值是实现定义的
2,假设'abc'实现定义是小端序4字节int,则 int 保存的值是`0x00616263`(内存中是`63626100`),根据c的舍入规则,取低位1字节,是'c',也就是0x63.

针对你的案例代码,我特地还用 gcc 和 clang 试了一下:

#include <stdio.h>

int main(void) {
printf("%08x %02x", '\a\bc', (char)'\a\bc');
return 0;
}

结果是 00070863 63

你说输出 \a 的话我建议你再检查下你的案例代码是怎么写的,

wuai习 发表于 2021-11-5 14:37

```cpp
char ch1 = 'abc';
int ch = 'abc';//6382179
//01100001 01100010 01100011,
//97 98 99
//ASCII码:a b c
       
char ch2 = '\abc';
int ch5 = '\abc';//483939
//0111 01100010 01100011
//7 98 99
//ASCII码:\a b c

char ch3 = '\a\bc';
int ch6 = '\a\bc';//6490119
//01100011 00001000 00000111,
//99 8 7
//ASCII码:c \b \a
```

wuai习 发表于 2021-11-5 14:40

wuai习 发表于 2021-11-5 14:37
```cpp
char ch1 = 'abc';
int ch = 'abc';//6382179


编译器提醒:“初始化”: 从“int”到“char”截断
重新定义int变量看了一下它的值,转化为二进制,实际就是这样存储的

你不会了解 发表于 2021-11-5 14:45

weakptr 发表于 2021-11-5 14:08
https://en.cppreference.com/w/cpp/language/character_literal

针对你的问题:


char ch1 = 'abc';
char ch2 = '\abc';
char ch3 = '\a\bc';
printf("%c %d\n", ch1, ch1);
printf("%c %d\n", ch2, ch2);
printf("%c %d\n", ch3, ch3);

就这么几行代码,写在main函数里,引入stdio头文件,其他没有

Win10,VS2019,Debug x64调试

最终输出结果(\a是警告提示,调试时听到声音了)

c 99
c 99
7

DEATHTOUCH 发表于 2021-11-5 15:42

gcc的结果是

c 99
c 99
c 99

改一下你的代码
#include <stdio.h>

int main()
{
    int i1 = 'abc';
    int i2 = '\abc';
    int i3 = '\a\bc';
    printf("%c %x\n", i1, i1);
    printf("%c %x\n", i2, i2);
    printf("%c %x\n", i3, i3);
}
结果就是
c 616263
c 76263
c 70863
我觉得很明显了
估计msvc的操作不一样吧
页: [1] 2
查看完整版本: C语言中char类型的数据'abc'、'\abc'、'\a\bc'三个的值为什么会这样?