首页 > 试题广场 >

在上下文及头文件均正常的情况下,下面代码的输出是什么?

[单选题]
在上下文及头文件均正常的情况下,下面代码的输出是什么?
auto fn = [](unsigned char a){ 
    cout << std::hex << (int)a << endl; 
};
fn(-1);
  • ff
  • 256
  • -1
  • Undefined
  • 0
int型-1的存储方式为补码(32位,4字节),1111 1111 1111 1111 1111 1111 1111 1111
转换为unsigned char(8位,1字节)发生字节截断,取最后八位为1111 1111
再转换为int后为0000 0000 0000 0000 0000 0000 1111 1111
即为ff
发表于 2015-09-08 22:26:58 回复(8)
题干中形式为C++11标准里引入的lambda表达式;一个lambda表达式表示一个可调用的代码单元,也可将其理解为一个未命名的内联函数。(引入它的便利之处大家可自行search)
其基本形式如下:
[capture list ] ( parameter list ) -> return type { function body }  即:
[捕获列表] ( 参数列表 ) -> 返回类型 { 函数体 }
1、capture list (捕获列表)是一个lambda所在函数中定义的局部变量的列表(通常为空,写为 [] ),空捕获列表即表明此lambda不使用它所在函数中的任何局部变量;
2、" -> " 表明lambda使用了尾置返回类型;
3、可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体;比如:
       auto f = [ ] { return 42; }; // 定义了一个可调用对象f,它不接受参数,返回42。
       即常见形式如: [ ] { 函数体 }    或     [ ] ( int n ) { 函数体 }  ...

关于本题的实际解答其他朋友已解释的很详细,不再细表。
编辑于 2016-08-29 23:37:34 回复(1)
-1 = 1000 0001
存储的是补码形式
①反码是1111 1110【符号位不变,其他位取反】
②补码是1111 1111【反码加1】
然后std::hex以十六进制显示【1111 1111】
发表于 2015-09-11 20:46:10 回复(1)
-1的原码应该是 1000 0000 0000 0000 0000 0000 0000 0001 第一位是符号位flag 但是计算机中存储的是补码 负数的原码转补码 要取反+1(符号位不变) 1111 1111 1111 1111 1111 1111 1111 1111 所以int型-1的存储方式为补码(32位,4字节) 1111 1111 1111 1111 1111 1111 1111 1111 转换为unsigned char(8位,1字节)发生字节截断,取最后八位为1111 1111 再转换为int后为0000 0000 0000 0000 0000 0000 1111 1111 即为ff
发表于 2021-10-19 15:34:03 回复(0)
首先-1默认是int(有符号),补码为ffffffff,传参时被截断为ff,最后转为int时,由于int完全可以容纳unsigned char,因此高位补零,输出ff,假如形参是char(有符号),那么转为int时,高位补符号位,则输出ffffffff。(测试环境 vs2008)
发表于 2016-10-17 17:52:43 回复(0)
无符号-1为255,输出格式为hex即十六进制,所以为ff
发表于 2015-09-05 16:42:45 回复(0)
负数在计算机中以补码形势存放。补码=原码的反码+1。
发表于 2015-09-07 15:17:29 回复(0)


编辑于 2015-09-05 15:31:49 回复(2)
int强制类型转换,-1的补码ffff,即ff
编辑于 2015-09-16 08:20:01 回复(4)
f(-1);
-1为有符号整型类型,-1的补码是1111 1111 1111 1111 1111 1111 1111 1111
unsigned char a = -1;
a为无符号字符类型,a的补码是 1111 1111
int(a);
由于a是无符号字符类型,需要整型提升不足的补0,即0000 0000 0000 0000 0000 0000 1111 1111
转换后的值为有符号整型,所以高位的0表示符号位,即正数,正数的原反补相同,所以int(a)转为十六进制为000000FF
发表于 2023-04-29 13:32:21 回复(0)

unsigned char a的取值范围是0-255,0-1得到最大值255(254=0-2,253=0-3,...),255+1得最小值0(1=255+2,2=255+3,......)
所以-1=0-1=255

发表于 2022-08-21 16:18:52 回复(0)
这题目看不懂啊。
发表于 2017-10-28 00:12:49 回复(0)
这题如果形参是char类型则结果是-1,即0xff转int后的有符号数表现形式
发表于 2016-07-09 14:55:43 回复(0)
在VC6.0里编译都通不过,VS2013才可以,第一次见这种写法,真无聊
发表于 2015-09-09 10:17:00 回复(2)
-1
10000000 00000001
111111111 111111110
111111111 111111111
无符号char8bit: 11111111 ,原反补相同
int : 整形提升:0000000 00000000 00000000 11111111=255
16进制位ff
发表于 2023-03-11 17:26:47 回复(0)
负数存储的是补码-1的二进制数:10000001,取反:11111110,加1:11111111,存在空间的是11111111。转换成int时,不管你是啥,只管你存的啥。所以是11111111。输出16进制数为ff
发表于 2020-02-18 10:07:28 回复(0)
 std::hex转换成十六进制形式输出
nt型-1的存储方式为补码(32位,4字节),1111 1111 1111 1111 1111 1111 1111 1111
转换为unsigned char(8位,1字节)发生字节截断,取最后八位为1111 1111
再转换为int后为0000 0000 0000 0000 0000 0000 1111 1111
即为ff

发表于 2018-09-29 17:49:52 回复(0)
-1 = 1000 0001
存储的是补码形式
①反码是1111 1110【符号位不变,其他位取反】
②补码是1111 1111【反码加1】
发表于 2018-08-15 09:45:39 回复(0)
发表于 2018-05-22 12:09:07 回复(0)
分析:32位-1的原码1000 0000 0000 0001

补码1111 1111 1111 1111(求反加一)

则fn()后8位为1111 1111
int 后0000 0000 1111 1111
Hex16进制后ff

 

int-1的存储方式为补码(32位,4字节),1111  1111  1111  1111

转换为unsigned char8位,1字节)发生字节截断,取最后八位为1111  1111 

再转换为int后为0000 0000 0000 0000 0000 0000 1111 1111 ,即为ff

发表于 2018-05-10 19:34:54 回复(0)