大神16进制转10进制的有关问题,多谢
求救大神16进制转10进制的问题,谢谢
大神,如下代码为什么返回的是-127,而不是+129
我需要+129啊,多谢大神了
bufheader[8]=0x81;
unsigned int xx=bufheader[8];
printf("%d",xx);
------解决方案--------------------

楼主把你的完整的代码拿出来看看,要是没问题再说说编译器什么的
------解决方案--------------------
unsigned int xx=bufheader[8];
把红色的删除掉。
找到bufheader[定义的地方,如果它的定义是char,将它加上unsigned char。
------解决方案--------------------
把红色的bufheader数组定义的的代码发上来。char似乎没法加 unsigned[?什么叫似乎?你试过没有?
------解决方案--------------------
unsigned int xx=(unsigned char)bufheader[8];
------解决方案--------------------
unsigned int xx=bufheader[8];
xx &= 0xFF;
printf("%d",xx);
------解决方案--------------------
bufheader[8]=0x81;
unsigned int xx=bufheader[8];
bufheader想必是char类型,属于有符号数,转换到32位的时候需要符号位扩展,所以这个赋值之后xx的值是0xFFFFFF81。
这个值用%d输出就是-127,而用%u输出是4294967169
xx &= 0xFF; 这样可以把高位全都清0,变成0x00000081
unsigned int xx=(unsigned char)bufheader[8]; 这样先把bufheader[8]转换成无符号数,再转换成32位的时候高位就不再补充符号位,而是直接填0,结果直接就是0x00000081
------解决方案--------------------
我想问你,有什么数值不是二进制的吗?计算机将所有的数都当做二进制来处理。对计算机来说并不存在16进制转10进制这样的问题。
你的程序输出结果错误,是因为char 和 unsiged char两个类型不匹配的问题。和16进制2进制什么的无关。
------解决方案--------------------
会有,把红色的部份加个-号你就可以看到了,unsigned int无法输出负号。你无法看到输出-100129。
int 转换到unsigned int或者unsigned int转int都会存在溢出它们的表示范围的问题。
------解决方案--------------------
如果你能保证int 型的值不会是负号,可以把它转到unsigned int,这样没有问题,因为unsigned int的正值范围要比int大。
------解决方案--------------------
unsigned int a,的意思是定义一个数a,它只能是正数,unsigned的意思是它没有符号的。
然后你将a=-100.这时候你说电脑要怎么办?你明明定义a是正数,你已经跟电脑说好它是没有符号的,但是你又给它赋值成负数,你觉得这样电脑这时应该怎么办才好?
------解决方案--------------------
printf("%d",xx);改为printf("%u",xx);
------解决方案--------------------
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
------解决方案--------------------
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
大神,如下代码为什么返回的是-127,而不是+129
我需要+129啊,多谢大神了
bufheader[8]=0x81;
unsigned int xx=bufheader[8];
printf("%d",xx);
------解决方案--------------------
楼主把你的完整的代码拿出来看看,要是没问题再说说编译器什么的
------解决方案--------------------
unsigned int xx=bufheader[8];
把红色的删除掉。
找到bufheader[定义的地方,如果它的定义是char,将它加上unsigned char。
------解决方案--------------------
把红色的bufheader数组定义的的代码发上来。char似乎没法加 unsigned[?什么叫似乎?你试过没有?
------解决方案--------------------
unsigned int xx=(unsigned char)bufheader[8];
------解决方案--------------------
unsigned int xx=bufheader[8];
xx &= 0xFF;
printf("%d",xx);
------解决方案--------------------
bufheader[8]=0x81;
unsigned int xx=bufheader[8];
bufheader想必是char类型,属于有符号数,转换到32位的时候需要符号位扩展,所以这个赋值之后xx的值是0xFFFFFF81。
这个值用%d输出就是-127,而用%u输出是4294967169
xx &= 0xFF; 这样可以把高位全都清0,变成0x00000081
unsigned int xx=(unsigned char)bufheader[8]; 这样先把bufheader[8]转换成无符号数,再转换成32位的时候高位就不再补充符号位,而是直接填0,结果直接就是0x00000081
------解决方案--------------------
bufheader[8]=0x81;
unsigned int xx=bufheader[8];
bufheader想必是char类型,属于有符号数,转换到32位的时候需要符号位扩展,所以这个赋值之后xx的值是0xFFFFFF81。
这个值用%d输出就是-127,而用%u输出是4294967169
xx &= 0xFF; 这样可以把高位全都清0,变成0x00000081
unsigned int xx=(unsigned char)bufheader[8]; 这样先把bufheader[8]转换成无符号数,再转换成32位的时候高位就不再补充符号位,而是直接填0,结果直接就是0x00000081
F是十进制15吧?为什么15就是负数呢?
不是2进制的第一个字节是1才是负数吗?
实际buf[8]是一个二进制值啊
我想问你,有什么数值不是二进制的吗?计算机将所有的数都当做二进制来处理。对计算机来说并不存在16进制转10进制这样的问题。
你的程序输出结果错误,是因为char 和 unsiged char两个类型不匹配的问题。和16进制2进制什么的无关。
------解决方案--------------------
请教大神,如下代码是否也会有类似的符号问题?
char* p=NULL;
char* p2=NULL;
char* str = new char[100];
char* str2 = new char[80];
strncpy(str2,"-100129",7);
p2=str2;
p=str;
memcpy(p,p2,7);
unsigned int xx=atoi(p);
cout<<xx;
会有,把红色的部份加个-号你就可以看到了,unsigned int无法输出负号。你无法看到输出-100129。
int 转换到unsigned int或者unsigned int转int都会存在溢出它们的表示范围的问题。
------解决方案--------------------
请教大神,如下代码是否也会有类似的符号问题?
char* p=NULL;
char* p2=NULL;
char* str = new char[100];
char* str2 = new char[80];
strncpy(str2,"-100129",7);
p2=str2;
p=str;
memcpy(p,p2,7);
unsigned int xx=atoi(p);
cout<<xx;
会有,把红色的部份加个-号你就可以看到了,unsigned int无法输出负号。你无法看到输出-100129。
int 转换到unsigned int或者unsigned int转int都会存在溢出它们的表示范围的问题。
大神,我在strncpy的时候,是一个字符串,这个字符串不会有"-"号的
如果你能保证int 型的值不会是负号,可以把它转到unsigned int,这样没有问题,因为unsigned int的正值范围要比int大。
------解决方案--------------------
unsigned int a,的意思是定义一个数a,它只能是正数,unsigned的意思是它没有符号的。
然后你将a=-100.这时候你说电脑要怎么办?你明明定义a是正数,你已经跟电脑说好它是没有符号的,但是你又给它赋值成负数,你觉得这样电脑这时应该怎么办才好?
------解决方案--------------------
printf("%d",xx);改为printf("%u",xx);
------解决方案--------------------
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
------解决方案--------------------
...
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)