腾讯笔试第一道选这题 C语言 有基础问题不解,希望高手解答

hexbina 2013-04-15 11:06:12
1.针对以下表达式,下列说法正确的是()
signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;

A. (a>0)&&(b>0)为真 B.(c==a)为真 C.b的十六进制为0xffffffe0 D.以上说法都不对
答案我认为选C。

在用VC6.0验证过程中,觉得有如下问题不解:
1.
根据溢出计算,a值实为-32,printf("%x",a);结果是0xffffffe0,而用printf("%x",32),输出一个正数时,当然也0x20;
问题1:printf()输出一个负数时,不管这个负数的类型是int,还是short或者char,是规定用四个字节来表示吗?这里我只是用四个字节表示,当然不会用四个字节去存储。
2.
在vc6.0环境中,我发现,signed int 和 unsigned int均是按照signed int来处理,
即范围均是-2147483648——2147483647,因此,上述表达式中,b=-32;
printf("%x",b);结果是0xffffffe0。
问题2,C语言中,以十六进制输出一个数,我觉得也是直接输出了该数的补码,不知这样理解对吗?
问题3,C语言中,将一个十六进制数赋给一个变量,可以认为,是将该十六进制直接作为该变量的补码吗?
...全文
605 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
文子 2013-04-16
  • 打赏
  • 举报
回复
学习 路过
__phoenix 2013-04-16
  • 打赏
  • 举报
回复

#include<stdlib.h>
#include<stdio.h>
int main()
{
signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;
if(a>0&&b>0)
printf("a>0&&b>0\n");
if(a==c)
printf("a==c");
char aa[10];
itoa(b,aa,16);
printf("%s\n",aa);
return 0;
}


故选C了。
nice_cxf 2013-04-15
  • 打赏
  • 举报
回复
严格意义上来说C也不是完全正确,在16位的tc下肯定不对,64位系统目前主流编译器int都是4字节,倒是没问题
aozhi 2013-04-15
  • 打赏
  • 举报
回复
哦。关于第二个问题。其实%x只是输出了一个十六进制数。还谈不上是原码还是补码。
大狗的偏执 2013-04-15
  • 打赏
  • 举报
回复
怎么处理是一回事 怎么打印有时另一回事 unsigned 用 格式化%d %x 打印出来的依然是有符号的
aozhi 2013-04-15
  • 打赏
  • 举报
回复
引用 1 楼 aozhi 的回复:
1、printf函数的格式字符串"%d"要求其对应的参数是int类型,也就是说,即便是char型的,也强转成int了。VC中是向你说的这样吗?我不确认哦。 2、输出的是补码,没错。 3、不正确。常量是有类型的。如果unsigned int a=0xffffffffUL;这种情况给的是源码。
打错字了。原码 我说得不一定准确,你想办法可以验证一下。
aozhi 2013-04-15
  • 打赏
  • 举报
回复
1、printf函数的格式字符串"%d"要求其对应的参数是int类型,也就是说,即便是char型的,也强转成int了。VC中是向你说的这样吗?我不确认哦。 2、输出的是补码,没错。 3、不正确。常量是有类型的。如果unsigned int a=0xffffffffUL;这种情况给的是源码。
sundq12 2013-04-15
  • 打赏
  • 举报
回复

signed char a=0xe0;//二进制为:1110 0000=-32
//有符号数赋值给无符号数,将有符号数转换为无符号数(c语言有这个原则)so->>b=0000 0000 1110 000=224
unsigned int b=a; 
unsigned char c=a;//c不存在溢出问题,所以c=1110 0000
A:错。因为a<0 B:对。因为char型与int型比较时自动提升为int型。 C:错。因为char型提升为无符号的int时,不够的位补零,(当然char提升为signed int时,不够位补1)。
ccc43542876 2013-04-15
  • 打赏
  • 举报
回复
引用 9 楼 aozhi 的回复:
引用 8 楼 Athenacle_ 的回复:引用 2 楼 aozhi 的回复:引用 1 楼 aozhi 的回复:1、printf函数的格式字符串"%d"要求其对应的参数是int类型,也就是说,即便是char型的,也强转成int了。VC中是向你说的这样吗?我不确认哦。 2、输出的是补码,没错。 3、不正确。常量是有类型的。如果unsigned int a=0xfffff……
无符号型的话,应该也是补码,只不过正数的补码和原码是一样的。所以。。。。你懂的。。不知道我理解对不对。
ccc43542876 2013-04-15
  • 打赏
  • 举报
回复
引用 10 楼 hexbina 的回复:
终于搞明白了, 首先,printf("%d");输出一个数时,会将此数转换为int型的,因此,输出char行的负数数时,会输出四个字节。再一点,char型的转换为int型时,有符号的以符号位补齐,无符号的即以0补齐。 其次,至于,C语言中,将一个十六进制数赋给一个变量,可以认为,是将该十六进制直接作为该变量的补码的。
那这样说的话,如果我将一个16进制数赋给一个变量,然后打印这个变量,则中间存在一个由补码到原码的转换了么?求告知一下。
hexbina 2013-04-15
  • 打赏
  • 举报
回复
终于搞明白了, 首先,printf("%d");输出一个数时,会将此数转换为int型的,因此,输出char行的负数数时,会输出四个字节。再一点,char型的转换为int型时,有符号的以符号位补齐,无符号的即以0补齐。 其次,至于,C语言中,将一个十六进制数赋给一个变量,可以认为,是将该十六进制直接作为该变量的补码的。
aozhi 2013-04-15
  • 打赏
  • 举报
回复
引用 8 楼 Athenacle_ 的回复:
引用 2 楼 aozhi 的回复:引用 1 楼 aozhi 的回复:1、printf函数的格式字符串"%d"要求其对应的参数是int类型,也就是说,即便是char型的,也强转成int了。VC中是向你说的这样吗?我不确认哦。 2、输出的是补码,没错。 3、不正确。常量是有类型的。如果unsigned int a=0xffffffffUL;这种情况给的是源码。 打错字了……
确定无符号类型用的也是补码?一直都认为是原码。
Athenacle_ 2013-04-15
  • 打赏
  • 举报
回复
引用 2 楼 aozhi 的回复:
引用 1 楼 aozhi 的回复:1、printf函数的格式字符串"%d"要求其对应的参数是int类型,也就是说,即便是char型的,也强转成int了。VC中是向你说的这样吗?我不确认哦。 2、输出的是补码,没错。 3、不正确。常量是有类型的。如果unsigned int a=0xffffffffUL;这种情况给的是源码。 打错字了。原码 我说得不一定准确,你……
当然是补码,只不过正数的补码是其本身
Athenacle_ 2013-04-15
  • 打赏
  • 举报
回复
printf变参函数,无论是int还是char还是short,全部提升至int进行传参
zhaopeng2511 2013-04-15
  • 打赏
  • 举报
回复
输出地址,然后查看对应地址内存数据: printf("%x\n",&a); printf("%x\n",a); //00422D8C //ffffffe0 内存中a中数据为:00422D8C E0 00 00 00 但输出a的值却为0xffffffe0 ,估计因为类型不正确导致用%x输出有误(一般%x是用于输出整型数据)。。。

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧