读书人

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

发布时间: 2013-09-07 14:12:44 作者: rapoo

求助 无符号型数据到有符号数据的转化
本帖最后由 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啊?

的?

读书人网 >C语言

热点推荐