1

所以我目前需要读入一串十六进制 ASCII 字符并使用它们来确定特定的操作码。为此,我打开一个文本文件(它不是真的,但为了简单的解释,我们称之为)然后在行中读取。因此,如果我得到像 40f1 这样的行...我让函数读取 2 个字符并将它们作为无符号整数存储到 mem_byte 中。然后我将它转换为一个字符以用作数组并保留信息的“字节”价值或通过读取 2 个十六进制数字的 ASCII 字符表示获得的两个十六进制数字的数值。

void getInstructions(FILE* read_file, int* stack_point, char** instructions, int size)
{
unsigned int mem_byte;
int ins_idx = 0;
char* ins_set = malloc(sizeof(char) * size);        //Set size of the array of bytes for memory. Temporarily holds the memory of the program

fscanf(read_file, "%d", stack_point);

//Reading in the memory from the program file
fscanf(read_file, " %2x", &mem_byte);       //Initial read to clear whitespace
ins_set[ins_idx] = (char) mem_byte;
ins_idx++;

while(fscanf(read_file, "%2x", &mem_byte) != 0) //Loops and reads 1 byte at a time until the fscanf hits the whitespace/end of the line its reading
{
    ins_set[ins_idx] = (char) mem_byte;
    printf("Byte: %x\n", ins_set[ins_idx]);
    ins_idx++;
}

strcpy(*instructions, ins_set);         //Copy the instruction set back to the original pointer for memory
free(ins_set);

return;

}

所以我遇到的问题是,如果我打印出测试结果,我会得到

Byte: 40
Byte: fffffff1

这意味着代码将 char 扩展为 4 字节数据类型。我不确定 char 是否包含来自 unsigned int 的信息并将其打印出来,或者我误解了 %x 或类型转换的工作原理。我想让我的 char 指令数组只保存 2 个十六进制数字的信息,仅此而已。

4

1 回答 1

2

type char,等的参数在传递给可变参数函数时会short被隐式转换为.intprintf

因此,其中一种类型的负值将被符号扩展,以便它拥有相同的 type 值int-1as a char(通常0xFF为 an unsigned char)将被隐式转换为-1as an int(它似乎将0xFFFFFFFF在您的系统上保持底层表示)。

考虑将您的论点转换为unsigned char以减轻您注意到的符号扩展。

例如printf("Byte: %x\n", (unsigned char) ins_set[ins_idx]);

于 2017-08-13T23:25:13.307 回答