首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

无符号型数据到有符号数据的转化

2013-09-07 
求助 无符号型数据到有符号数据的转化本帖最后由 yeh201111 于 2013-09-04 14:56:47 编辑各位大侠,这个问

求助 无符号型数据到有符号数据的转化
本帖最后由 yeh201111 于 2013-09-04 14:56:47 编辑 各位大侠,这个问题应该怎么理解啊?

unsigned int a = 0xDDDD DDD7;
char *b = (char *)&a;


*b的值为什么为FFFF FFD7啊?
不是应该只占一个字节吗?

如果我把a的值改为0xDDDD DD77, 然后*b的值就变为77

这应该牵涉到无符号型、符号型之间的转化到底是怎样?

求高手讲解一下 C?无符号型字节转换
[解决办法]

printf("*b==%02X\n",(unsigned char)(*b));

相由心生。
[解决办法]
涉及一大波未定义行为和实现定义行为

(char *)&a;
涉及机器大小端 
表达式得到的char*指针 保证是指向对象a的最低字节 
但是 对象a的最低字节存储的是 DD 还是 D7 这个涉及机器大小端

传入参数 char类型 格式控制符号是 %x 不匹配 这个是未定义行为

在实现上 char 类型入栈的时候 会按照4个字节入栈
这里 又涉及另一个问题 
char可以实现为 signed char 或者是 unsigned char
实现为unsigned char的话 你看到的结果就又不一样了



[解决办法]
引用:
涉及一大波未定义行为和实现定义行为

(char *)&a;
涉及机器大小端 
表达式得到的char*指针 保证是指向对象a的最低字节 
但是 对象a的最低字节存储的是 DD 还是 D7 这个涉及机器大小端

传入参数 char类型 格式控制符号是 %x 不匹配 这个是未定义行为

在实现上 char 类型入栈的时候 会按照4个字节入栈
这里 又涉及另一个问题 
char可以实现为 signed char 或者是 unsigned char
实现为unsigned char的话 你看到的结果就又不一样了

printf 参数%x,传char进去是为定义?这个显然不是未定义,是类型强制转换
[解决办法]
引用:
Quote: 引用:

printf("*b==%02X\n",(unsigned char)(*b));

相由心生。


你好,输出格式是这样子的:
printf("%x", *b)

输出结果为0xFFFF FFD7,能帮忙解释一下为什么吗 ?
多谢了

跟踪这位说“相由心生”的大神很久了,他的意思是你对printf的输出格式设置成什么形式,输出就是什么样子。注意你和他输出格式的区别,“%X”并不是针对char类型做输出的,他的格式设置中加了“02”。
------解决方案--------------------


*b本身的值是一个BYTE而已,用调试器去看是最准确的。不过你有这样的疑问说明你是用printf去打印的,这样*b有机会提升到int类型,会进行符号扩展:
1、无符号数扩充的时候,前面一律补0
2、有符号数扩充的时候,前面所补的数取决于原数的最高位

引用:
各位大侠,这个问题应该怎么理解啊?

unsigned int a = 0xDDDD DDD7;
char *b = (char *)&a;


*b的值为什么为FFFF FFD7啊?
不是应该只占一个字节吗?

如果我把a的值改为0xDDDD DD77, 然后*b的值就变为77

这应该牵涉到无符号型、符号型之间的转化到底是怎样?

求高手讲解一下

[解决办法]
引用:
Quote: 引用:

printf 参数%x,传char进去是为定义?这个显然不是未定义,是类型强制转换
那你就弄错了 这里的内存对齐而不是类型转换 

格式控制符 %x 传入char 当然是未定义行为 
%x 只用于 unsigned int

如果是scanf,这样的确是未定义,但是printf不是,如果你用内存对齐,没法解释前边加的ffffff,应该是随机的,这里明显是类型转换,由char转成了int
[解决办法]
看汇编就知道了
char test =240;
004113CE  mov         byte ptr [test],0F0h 
printf("%x\n",test);
004113D2  movsx       eax,byte ptr [test] 
004113D6  mov         esi,esp 
004113D8  push        eax  
004113D9  push        offset string "%x\n" (415750h) 
004113DE  call        dword ptr [__imp__printf (4182BCh)] 
004113E4  add         esp,8 
004113E7  cmp         esi,esp 
004113E9  call        @ILT+310(__RTC_CheckEsp) (41113Bh) 
printf("%x\n",(int)test);
004113EE  movsx       eax,byte ptr [test] 
004113F2  mov         esi,esp 
004113F4  push        eax  
004113F5  push        offset string "%x\n" (415750h) 
004113FA  call        dword ptr [__imp__printf (4182BCh)] 
00411400  add         esp,8 
00411403  cmp         esi,esp 


00411405  call        @ILT+310(__RTC_CheckEsp) (41113Bh) 

[解决办法]
你如何看到

*b的值为什么为FFFF FFD7啊?

的?

热点排行