int到char数组的转换是如何发生的
How does int to char array conversion occurs?
void main()
{
int a;
char *x;
x = (char*)&a;
a = 500;
x[0] = 2;
x[1] = 2;
x[2] = 0;
cout<<"final op : "<<a;
}
我知道答案是514。但是它是如何工作的呢?
首先,请注意这是如何工作的并不是由C或c++标准规定的,并且您真的不应该依赖于任何特定的行为,除非您真的知道您在做什么及其后果。(既然你必须问,你不属于这一类,即使在阅读了这个答案之后!)
最常见的两种方法是将整数以256为基数存储,每个字节存储一个数字(字节通常是8位,2^8 = 256
)。因此,当您通过char*
访问它时,每个位置代表一个数字。
在小端序格式中,按数量级访问数字;例如,x[0]
有个位,x[1]
有256位,x[2]
有256^2位,以此类推。也就是说,从右到左访问数字
在大端序格式中,数字的顺序相反。
哪种格式通常由计算机硬件决定。
一个int
有多少个256进制的数字也可以变化。4位数是常见的,但2和8也会发生,甚至在一些特殊的环境中,int
根本不适合这种情况。
在特定的计算机和编程环境中,int
可能是至少4位数字,并且以小端序形式存储;所以赋值500
意味着数字是
0, 0, 1, 244
(because 500 = 244 * 1 + 1 * 256
;还记得如何计算基数的变化吗?)然后赋值将数字更改为
0, 0, 2, 2
表示2 * 1 + 2 * 256 = 514
。
(另外,请注意,如果char
在您的编程环境中是签名的,那么您可能会将500
的最右边的数字读取为-12
而不是244
:查找two的补码符号)
工作方式是x
指向与a
保存数据的位置相同的位置。当你对x[0]
写入或读取时,你访问的是a
中保存的值的第一个字节。这不是在char数组和int之间进行转换,这是"通过char指针访问int"。
相关文章:
- C++将派生类转换为基类时'object slicing'期间发生的情况
- 当我使用 void 函数的返回值(通过强制转换函数指针)时,究竟会发生什么?
- 为什么在类型转换的 nullptr 上不发生隐式转换
- 类模板中未发生隐式转换
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?
- 使用 opencv 凸胡尔 获取给定点的面积. - 点到垫子转换期间发生错误
- std::filesystem::p ath 和 std::string 之间的隐式转换,应该发生吗?
- 为什么用户定义的转换不会在调用对象上隐式发生
- 为什么在波纹管程序中发生了从字符串常量到'char*'的警告已弃用的转换
- 两种类型转换有何不同?
- 隐式类型转换何时在C++发生?
- 当函数调用时,试图阻止数组更改时发生无效转换错误
- 使用 GCC 7.3.0 时发生代码转换错误
- 当我们递增下面的类型转换指针时会发生什么?
- 在C++中对指针进行类型转换"sideways"时会发生什么情况
- 隐式强制转换在 C++ 表达式中发生的时间点
- 为什么显式 bool() 转换在上下文转换中不发生
- 使用基类中定义的函数返回指向派生类实例的指针时发生无效转换错误
- C 构造函数隐式转换不会发生
- 如果我除以 1,隐式类型转换不会发生