San*_*ana -4 c c++ memory-address
32位系统中的字大小为4字节.所以char a ='bcd'; 已验证.4个ASCII字符可以容纳32位整数.
char a='bcd';
//output is d for this line
printf("%c\n",a);
//output is 'z' when i use *(&a-1) and '?'(is -67 when manipulated)
printf("%c\n",*(&a-1));
Run Code Online (Sandbox Code Playgroud)
现在我在这里只是想知道会有什么&a-1 (this is not 'b')意义?它的最后一个内存地址?还有一件事是字符被打包成的顺序int.
------------------------------------------------------------------------------
| bits : _ _ _ _ _ _ _ 8 _ _ _ _ _ _ _ 16 _ _ _ _ _ _ _ 24 _ _ _ _ _ _ _ 32 |
| order : ? ? ? ? ? ? ? 8 ? ? ? ? ? ? ? 16 ? ? ? ? ? ? ? 24 ? ? ? ? ? ? ? 32 |
------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
"所以char a ='bcd';是有效的." 不,它不是,至少不是在这个意义上,你会期望(是的,'bcd'是一个多字节字符常量,但这并不会因为你似乎期望存储多个字符,但一些实现定义的数字).
一char持有单个字符,它始终是一个字节长.写作char a给你一个字节可以玩.您无法访问该通道之前和之后的字节a.如果它不想要,编译器也不需要在你的周围添加任何填充char.由于文字'bcd'(至少在我的系统上)有一个不适合char(我的系统上的6447972 )的值,因此最终得到一个char具有实现定义值的单个字节.即使周围有填充字节a,也不能假设它们被写入.
printf("%c\n",*(&a-1));
Run Code Online (Sandbox Code Playgroud)
因为您没有该内存,所以会调用未定义的行为.这与任何类型的"字大小"无关.
如果要存储一系列字符使用
const char *str = "Some text";
Run Code Online (Sandbox Code Playgroud)
(要么
char str[] = "Some text";
Run Code Online (Sandbox Code Playgroud)
如果你想在C或中修改序列)
std::string str = "Some text";
Run Code Online (Sandbox Code Playgroud)
在C++中.
好的,你的编辑让你更清楚你在说什么.引用你发布的内容:
4个ASCII字符可以容纳32位整数
但是a char不是32位整数.它通常是一个8位整数.你发布的文字讲的是类似的东西
int32_t a = 'bcd';
Run Code Online (Sandbox Code Playgroud)
(或可能uint32_t a).现在a实际上是32位长,可以容纳32位信息.但正如你引用的文字所说,这很少有用,因为这种分配的结果完全取决于实现.