使用带符号的 char 指针更改 int 数组的值
Changing value of an int array with a signed char pointer
我想创建一个函数来将空数组索引的值更改为指定值。
我正在测试一个简单的函数,该函数使用数组中的 char copy 更改特定索引的值(char 是 1 个字节)。我使用 char 是因为我可以向 copy 添加一个以指向下一个索引并更改值。
函数是:
void
change_value(int ** ptrs, int pos, int val) {
char * cp = *ptrs;
/* Assign a copy of the array */
unsigned long int iter = sizeof(int) / sizeof(char);
/* Store the size for every index of the array */
for (int i = 0; i < pos; i++)
for (unsigned long int e = 0; e < iter; e++)
cp++;
/* Advance to the position */
*cp = (signed char)val;
/* Assign the value */
}
当我尝试将值更改为 -1 时出现问题。我认为问题是因为在将 char 分配给 int 时,-1 被转换为 255,所以我在分配中添加了转换为 a 符号字符。但是还是没有结果。
主要功能是:
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;
/* Create an array for values */
change_value(&arr, 1, 0);
/* Change value */
for (int i = 0; i < 5; i++)
printf("arr[%d] : %d\n", i, arr[i]);
/* Show the array */
printf("\n");
change_value(&arr, 2, -1);
/* Change value */
for (int i = 0; i < 5; i++)
printf("arr[%d] : %d\n", i, arr[i]);
/* Show the array */
输出:
arr[0] : 1
arr[1] : 0
arr[2] : 3
arr[3] : 4
arr[4] : 5
arr[0] : 1
arr[1] : 0
arr[2] : 255
arr[3] : 4
arr[4] : 5
问题是你没有sign extending价值。
int x = 0;
*((signed char *)&x) = (signed char)-1;
printf("%08x\n", -1); // FFFFFFFF
printf("%08x\n", 255); // 000000FF
printf("%08x\n", x); // 000000FF
换句话说,将 int
的值设置为 -1
需要修改其字节的 all。
但请注意,这样做您将依赖于两个实现定义的行为,使此代码不可移植:
我想创建一个函数来将空数组索引的值更改为指定值。
我正在测试一个简单的函数,该函数使用数组中的 char copy 更改特定索引的值(char 是 1 个字节)。我使用 char 是因为我可以向 copy 添加一个以指向下一个索引并更改值。
函数是:
void
change_value(int ** ptrs, int pos, int val) {
char * cp = *ptrs;
/* Assign a copy of the array */
unsigned long int iter = sizeof(int) / sizeof(char);
/* Store the size for every index of the array */
for (int i = 0; i < pos; i++)
for (unsigned long int e = 0; e < iter; e++)
cp++;
/* Advance to the position */
*cp = (signed char)val;
/* Assign the value */
}
当我尝试将值更改为 -1 时出现问题。我认为问题是因为在将 char 分配给 int 时,-1 被转换为 255,所以我在分配中添加了转换为 a 符号字符。但是还是没有结果。
主要功能是:
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;
/* Create an array for values */
change_value(&arr, 1, 0);
/* Change value */
for (int i = 0; i < 5; i++)
printf("arr[%d] : %d\n", i, arr[i]);
/* Show the array */
printf("\n");
change_value(&arr, 2, -1);
/* Change value */
for (int i = 0; i < 5; i++)
printf("arr[%d] : %d\n", i, arr[i]);
/* Show the array */
输出:
arr[0] : 1
arr[1] : 0
arr[2] : 3
arr[3] : 4
arr[4] : 5
arr[0] : 1
arr[1] : 0
arr[2] : 255
arr[3] : 4
arr[4] : 5
问题是你没有sign extending价值。
int x = 0;
*((signed char *)&x) = (signed char)-1;
printf("%08x\n", -1); // FFFFFFFF
printf("%08x\n", 255); // 000000FF
printf("%08x\n", x); // 000000FF
换句话说,将 int
的值设置为 -1
需要修改其字节的 all。
但请注意,这样做您将依赖于两个实现定义的行为,使此代码不可移植: