首页 > 试题广场 >

32位机上根据下面的代码,问哪些说法是正确的?

[单选题]
32位机上根据下面的代码,问哪些说法是正确的?
signed char a = 0xe0;
unsigned int b = a;
unsigned char c = a;
  • a>0 && c>0 为真
  • a == c 为真
  • b 的十六进制表示是:0xffffffe0
  • 上面都不对
推荐
同等位数的类型之间的赋值表达式不会改变其在内存之中的表现形式,因此通过 unsigned char c = a;语句,c的位存储形式还是0xe0

对于B选项,编译器首先检查关系表达式"==" 左右两边a ,c的类型,如果某个类型是比int的位宽小的类型,就会先进行Integer Promotion,将其提升为int类型,至于提升的方法,是先根据原始类型进行位扩展(如果原始类型为unsigned ,进行零扩展,如果原始类型为signed,进行符号位扩展)至32位,再根据需要进行unsigned to int 形式的转换。
因此:
a 为signed char    型,位宽比int小,执行符号位扩展,被提升为 0xffffffe0;
c 为unsigned char型,位宽比int小,执行零扩展,被提升为 0x000000e0;

经过以上步骤,再对两边进行比较,显然发现左右是不同的,因此==表达式值为false。

再举一个例子:
-------------------------------------
signed int a = 0xe0000000
unsigned int b = a;
cout<< (b == a) <<endl;
-------------------------------------
结果为 1, 因为a、b位宽已经达到了int的位宽,均不需要Integer Promotion,只需要对a执行从unsigned to signed的转换,然而这并不影响其在内存中的表现形式,因此和b比较起来结果为真。

参考:https://www.securecoding.cert.org/confluence/display/cplusplus/INT02-CPP.+Understand+integer+conversion+rules

编辑于 2016-08-25 08:56:37 回复(10)
将char转换为int时关键看char是unsigned还是signed,如果是unsigned就执行0扩展,如果是signed就执行符号位扩展。跟int本身是signed还是unsiged无关。
发表于 2015-10-06 21:55:42 回复(0)

考点:有符号数和无符号数之间的转换

解析:

  • 0xe0转换成二进制是1110 0000,因为0xe0的最高位是1,所以作为有符号数的时候就是负数,作为无符号数的时候就是正数,因此A选项是错的,同时B也是错误的。
  • 负数的高位用1补齐,正数的高位用0补齐,所以b(0xe0)的二进制表示形式是1111 1111 1111 1111 1111 1111 1110 0000,十六进制的表示形式是0xffffffe0
发表于 2015-08-04 12:34:04 回复(1)
C
a为负数,c为正数。负数扩充高位用1来补全
发表于 2015-04-06 21:17:43 回复(3)
(1) 扩展问题
符号位扩展:有符号数向其它类型数据转化(如char到int,char到unsigned int);
零扩展:无符号数向其它类型转换(如unsigned char到int, long)。
所以b的值:0xffffffe0

(2)整形提升
在表达式计算时,各种整形首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。
所以对于:a == c,二者都会提升为int,然后再比较。
a -> 0xffffffe0.
c -> 0x000000ex.
发表于 2016-03-17 19:15:35 回复(0)
0xe0为14*16=224超过+127的范围所以a为负的
发表于 2015-06-16 17:50:00 回复(0)
数据在内存中的存储形式是不会变的,但是输出形式会依据数据类型而定,故c在内存中的存储值仍为0xe0。将char转换为int时,若为unsigned char,则进行0扩展;若为signed char,则进行符号位扩展,向高位补充1,故a和b的值均为0xffffffe0,同理c的值为0x000000e0。
编辑于 2018-11-27 14:51:33 回复(0)
隐式类型转换时,若同时存在符号和长度转换,先进行长度转换,之后进行符号转换
发表于 2018-04-03 17:08:43 回复(0)
对于有符号数,位数扩展时候扩展的是符号位,符号位为0则扩展0,符号位为1则扩展1
发表于 2017-06-27 08:07:49 回复(1)
  • 把最高位作为符号位 
  • 将0xe0转换成二进制是1110 0000,因为0xe0的最高位是1,所以作为有符号数的时候就是负数,作为无符号数的时候就是正数 
  • 负数的高位用1补齐,正数的高位用0补齐,所以b(0xe0)的二进制表示形式是1111 1111 1111 1111 1111 1111 1110 0000,十六进制的表示形式是0xffffffe0。
发表于 2016-09-08 23:36:57 回复(0)
C
a为负
c为正
b为正
发表于 2015-04-09 13:03:08 回复(1)

我的理解:值有两个,表面值和内存值

  1. 表面值在转换时会根据具体数据类型而定,
  2. 而内存值在类型转换的时候恒定不变。

如果是两个数据类型不同的值进行比较,先转换成int 型

其中,Unsign char (为正数)进行0扩展,

sign  char(为负数的情况下)进行符号位扩展(即高位用1自动补齐)。

由于表面值不同(即数据类型不同),A选项和B选项错。

由于内存值不变,0xe0(二进制:1110 0000)在unsigned  int b中不变,
作为有符号的时候(signed char a)是负数(1111 1111 1111 1111 1111 1111 1110 0000),
所以十六进制为0xffffffe0。但转化时表面值发生了变化,因为a和b数据类型不同。

发表于 2018-10-03 11:55:48 回复(0)
一、类型的提升
   把char、unsigned char、short、unsigned short转换成int类型称为类型提升(promotion)。
1. 如果short的字节长度小于int的字节长度
   char转换成 int
   unsigned char转换成 int
   short转换成 int
   unsigned short转换成 int
2. 如果short的字节长度等于int的字节长度
   char转换成 int
   unsigned char转换成 int
   short转换成 int
   unsigned short转换成 unsigned int
二、类型的转换
    long double、double、float、unsigned long long、long long、unsigned long、long、unsigned int、int之间的转换称为类型转换
1. 如果int的字节长度小于long的字节长度
   类型等级由高到低依次为:long double、double、float、 unsigned long long、long long、unsigned long、long、unsigned int、int
2. 如果int的字节长度等于long的字节长度
   类型等级由高到低依次为:long double、double、float、unsigned long long、long long、unsigned long、unsigned int、long、int
3. 在任何涉及两种数据类型的操作中,它们之间等级较低的类型会被转换成等级较高的类型。
发表于 2018-08-11 10:15:33 回复(0)
首先我们把变量分为内存数据和表面值,比如signed char a = 0xff 和 unsigned char b = 0xff;
内存数据均为0xff,表面值为一个是-1,一个是255.
然后根据实际程序:

发现规律如下:
1. 内存大小相同(位数相同,比如char和uchar)的两个变量赋值,直接拷贝内存数据,
    表面值是多少具体看数据类型;
2. 内存的大小不同的两个变量赋值,一般是小(比如char)赋给大的(int)内存,
    先把小内存数按照“表面值不变”的规则升级为大内存数,然后就成了内存大小相同的赋值,参考1.
发表于 2018-04-15 11:31:01 回复(0)
a为负数
发表于 2017-10-24 11:06:27 回复(0)
补码表示
发表于 2017-03-06 10:11:21 回复(0)
谁能解释一下下面程序的输出吗 int main() { signed char a = 0xe0; unsigned int b =a; unsigned char c = a; cout<<hex<<a<<endl; cout<<hex<<b<<endl; cout<<hex<<c<<endl; }

编辑于 2016-11-08 09:55:48 回复(0)
b的值只和a的符号有关,而和b自己的符号无关。故,b=a=ffffffe0
发表于 2016-05-31 20:57:54 回复(0)
0xe0已经是补码。且是负数。所以转换为unsigned int ,负数高位用1补齐,为0xffffffe0。
发表于 2016-05-23 22:08:00 回复(0)
类型转换有符号到无符号转换哪个先??
发表于 2015-06-06 15:21:59 回复(0)