2的补码转换器在C++
2's complement converter in C++
我被卡住了,我一直在看我的代码几个小时,我似乎不知道哪里出错了。我的函数所做的是,它将接受一个负数或正数,并将其转换为32位的16进制补数。我的函数接受一个字符数组(以32位带符号的幅度表示),并接受该数组的2的补码。我将其转换为2的补码的方法是在看到某个字符时简单地将一个字符分配到数组中。如果在数组中看到的字符是第一个字符,则会出现特殊情况。其余部分通常是否定的。我现在被卡住了。当我输入值-23(符号大小为80000017)时,我得到值K00000KK。-23452(符号星等80005B9C) -> K000KKKK。我将值设置为"K"以找出代码卡住的地方,原始值为"7"。在代码中,我放置了显示消息来查看编译器要去哪里
for -23 (80000017) input I get the messages
first 1 is seen, leave first 1 the same
first 1 is seen, leave first 1 the same
no one's showed up yet --> 0
no one's showed up yet --> 0
no one's showed up yet --> 0
no one's showed up yet --> 0
no one's showed up yet --> 0
first 1 is seen, leave first 1 the same
基本上显示K的地方就是我得到第一个1消息的地方而显示0的地方我得到-> 0消息
谢谢你的帮助!感谢!
这里是我的代码的粘贴链接,因为代码的格式惹恼了我…
http://pastebin.com/KSeymwcschar* two_complement(int number, char* sign_mag_array){
int first_one_flag = 0;
if(number > 0){
cout << "positive number" << endl;
return sign_mag_array;
}
if(number < 0){
for(int q = 7; q >= 0; q--){
if(first_one_flag == 1){ // negate the rest regularly
cout << "negate normally " << endl;
if(sign_mag_array[q] == '0'){
sign_mag_array[q] = 'F';
}
if(sign_mag_array[q] == '1'){
sign_mag_array[q] = 'E';
}
if(sign_mag_array[q] == '2'){
sign_mag_array[q] = 'D';
}
if(sign_mag_array[q] == '3'){
sign_mag_array[q] = 'C';
}
if(sign_mag_array[q] == '4'){
sign_mag_array[q] = 'D';
}
if(sign_mag_array[q] == '5'){
sign_mag_array[q] = 'A';
}
if(sign_mag_array[q] = '6'){
sign_mag_array[q] = '9';
}
if(sign_mag_array[q] == '7'){
sign_mag_array[q] = '8';
}
if(sign_mag_array[q] == '8'){
sign_mag_array[q] = '7';
}
if(sign_mag_array[q] = '9'){
sign_mag_array[q] = '6';
}
if(sign_mag_array[q] == 'A'){
sign_mag_array[q] = '5';
}
if(sign_mag_array[q] == 'B'){
sign_mag_array[q] = '4';
}
if(sign_mag_array[q] = 'C'){
sign_mag_array[q] = '3';
}
if(sign_mag_array[q] == 'D'){
sign_mag_array[q] = '2';
}
if(sign_mag_array[q] == 'E'){
sign_mag_array[q] = '1';
}
if(sign_mag_array[q] == 'F'){
sign_mag_array[q] = '0';
}
}
if(sign_mag_array[q] == '0' && first_one_flag == 0){
cout << "no one's showed up yet --> 0 " << endl;
}
else{ // first '1' in binary seen. special negating
//first_one_flag = 1;
cout << "first 1 is seen, leave first 1 the same " << endl;
if(sign_mag_array[q] == '1'){
sign_mag_array[q] = 'F';
}
if(sign_mag_array[q] == '2'){
sign_mag_array[q] = 'E';
}
if(sign_mag_array[q] == '3'){
sign_mag_array[q] = 'D';
}
if(sign_mag_array[q] == '4'){
sign_mag_array[q] = 'C';
}
if(sign_mag_array[q] == '5'){
sign_mag_array[q] = 'B';
}
if(sign_mag_array[q] == '6'){
sign_mag_array[q] = 'A';
}
if(sign_mag_array[q] = '7'){
sign_mag_array[q] = '9';
}
if(sign_mag_array[q] == '8'){
sign_mag_array[q] = '8';
}
if(sign_mag_array[q] == '9'){
sign_mag_array[q] = 'K';
}
if(sign_mag_array[q] == 'A'){
sign_mag_array[q] = '6';
}
if(sign_mag_array[q] == 'B'){
sign_mag_array[q] = '5';
}
if(sign_mag_array[q] == 'C'){
sign_mag_array[q] = '4';
}
if(sign_mag_array[q] == 'D'){
sign_mag_array[q] = '3';
}
if(sign_mag_array[q] == 'E'){
sign_mag_array[q] = '2';
}
if(sign_mag_array[q] == 'F'){
sign_mag_array[q] = '1';
}
}
}
}
return sign_mag_array;
}
错误很简单
if(sign_mag_array[q] = '7'){
sign_mag_array[q] = '9';
}
应该 if(sign_mag_array[q] == '7'){
sign_mag_array[q] = '9';
}
和
if(sign_mag_array[q] = 'C'){
sign_mag_array[q] = '3';
}
应该 if(sign_mag_array[q] == 'C'){
sign_mag_array[q] = '3';
}
和
if(sign_mag_array[q] = '9'){
sign_mag_array[q] = '6';
}
应该 if(sign_mag_array[q] == '9'){
sign_mag_array[q] = '6';
}
等。等。我想你已经明白了,
有这么多重复的代码是糟糕的风格,容易犯这样的错误。您应该能够通过一点数学知识大大简化和缩短这段代码。例如,添加两个函数将十六进制数字转换为整数,反之亦然
int hex_to_int(char x)
{
return x <= '9' ? x - '0' : 10 + (x - 'A');
}
char int_to_hex(int x)
{
return x < 10 ? '0' + x : 'A' + (x - 10);
}
和现在这样的代码
if(sign_mag_array[q] == '0'){
sign_mag_array[q] = 'F';
}
if(sign_mag_array[q] == '1'){
sign_mag_array[q] = 'E';
}
...
if(sign_mag_array[q] == 'E'){
sign_mag_array[q] = '1';
}
if(sign_mag_array[q] == 'F'){
sign_mag_array[q] = '0';
}
是
if (sign_mag_array[q] >= '0' && sign_mag_array[q] <= '9' ||
sign_mag_array[q] >= 'A' && sign_mag_array[q] <= 'F')
{
int digit = hex_to_int(sign_mag_array[q]);
sign_mag_array[q] = int_to_hex(15 - digit);
}
将48行重复的代码减少到非常少。作为奖励,它还解决了Zeta发现的问题。
除了约翰所说的,你的逻辑目前是错误的。看一下下面的代码片段:
if(sign_mag_array[q] == '1'){
sign_mag_array[q] = 'F';
}
/* ... */
if(sign_mag_array[q] == 'F'){
sign_mag_array[q] = '1';
}
如果sign_mag_array[q]
为'1'
,则设置为'F'
。这将导致后面的条件为真,因此sign_mag_array[q]
被重置为'1'
。
您想要独占条件:
if(sign_mag_array[q] == '1'){
sign_mag_array[q] = 'F';
}
else if(sign_mag_array[q] == '2'){
sign_mag_array[q] = 'E';
}
/* ... */
else if(sign_mag_array[q] == 'F'){
sign_mag_array[q] = '1';
}
既然你已经排他了,你可以简单地使用switch
而不是一长串if:
switch(sign_mag_array[q]){
case 'F': sign_mag_array[q] = '1'; break;
case 'E': sign_mag_array[q] = '2'; break;
/* ... */
case '1': sign_mag_array[q] = 'F'; break;
}
相关文章:
- 转换器练习:跳过 if 语句和 if 语句
- 使用转换器提升 Python 问题 - 静态链接
- 我写的 ASCII 到二进制转换器C++向后显示二进制,如何使其正确显示?
- 十进制到二进制转换器 c++
- 用于 boost::p roperty_tree 的通用枚举转换器
- 为什么我的C++基转换器中出现分段错误?
- 将字节数组转换为对象C++ |C++中的 C# 位转换器
- 英语到摩尔斯电码转换器
- 我用c++做了一个转换器,把英里转换成公里,把公里转换成英里,把赛尔修斯转换成法赫伦海特,把法赫伦海特转换成赛尔修斯
- 使用 Json 转换器反序列化 WCF 服务中的C++字符串
- 十进制,包括负到 32 位二进制转换器
- 标准::映射转换器模板
- 英里到千克转换器练习的小语法错误
- 句子转换器在存在新行的情况下不起作用
- 在C Windows程序中获取A/D转换器示例程序
- ROS中未定义的参考误差到OpenCV图像转换器
- 表达式到C++类类型转换器/类型转换
- 这里怎么了?单位转换器
- 华氏度到摄氏转换器C
- 如何理解 c++ 中的 MNIST 二进制转换器?