首页 > 试题广场 >

有以下程序,则程序的输出结果是?

[单选题]

有以下程序

#include <stdio.h>
main(){
    int i=0;
    i=~i;
    printf("%d\n",i);
}

程序运行后的输出结果是?

  • 8
  • 0
  • 1
  • -1
推荐
本题考查位运算中按位取反,0按位取反就是-1,所以选项D正确。
编辑于 2015-02-03 20:51:11 回复(0)
0 = 00000000000000000000000000000000
取反11111111111111111111111111111111就是-1在计算机的存储形式
计算机内, 负数已反码形式存储, 符号位不变, 源码求反加1, 就是反码
11111111111111111111111111111111 就是
10000000000000000000000000000001 求反 11111111111111111111111111111110
加1 就是 11111111111111111111111111111111
发表于 2015-08-21 10:46:35 回复(5)
以~9为例:
1)将待计算的数用2进制表示,位数最少为可以表示出当前数的绝对值的二进制位数加1(多1位符号位)。也就是将9表示为01001,其中最左面的0是符号位,0为正,1为负。
2)按位取反(对于符号位同样取反)10110,符号位为1,则为负数,那该负数时多少呢?计算方法:除了符号位,0110取反加1,变为1010,即为10,最后就是-10.

发表于 2016-06-11 15:27:50 回复(0)
0取补码就是1111111111111111,要想知道这个2进制的值,就先得到他正值是什么,他公式是-1取反(一个正数的相反数取得公式是取反加1,这个正好相反)就是111111111111110,然后取反,就是00000000000000001,也就是1,那个数的相反数是1,则那个数是-1
编辑于 2016-11-05 11:32:18 回复(0)
补码形式存储数字:0按位取反之后11111111111111111111111111111111就是-1的补码形式
发表于 2015-09-04 16:06:35 回复(0)
~是位求反运算符,将运算对象逐位求反后生成一个新值,将1置为0,将0置为1。
因为位运算符会把运算对象看成二进制,int类型4个字节,i=0表示为二进制:00000000 00000000 00000000 00000000
~i则为11111111 11111111 11111111 11111111,这个数用十进制表示是多少呢?其实就是-1。
因为计算机中负数使用补码来表示的,其实正数也是用补码来表示,只是正数的补码是本身。
补码的表示方法:
正数的补码就是本身;
负数的补码就是在原码的基础上,符号位不变(最高位表示符号位,0表示正,1表示负),其余各位取反,最后加1。
[-1] = [10000000 00000000 00000000 00000001] = [11111111 11111111 11111111 11111110] = [11111111 11111111 11111111 11111111]
所以答案为-1

一开始想成了逻辑非,!i的结果才是1。


参考博客:
发表于 2020-06-18 20:12:16 回复(0)
对于任意整型数n的按位取反公式为:~n=-(n+1)
发表于 2017-08-08 10:44:37 回复(1)
~:按位取反(包括符号位)
0000 0000 0000 0000 0000 0000 0000 0000 取反-> 1111 1111 1111 1111 1111 1111 1111 1111 (补码)
原码=(补码-1)再取反(不包含符号位)
       = 1111 1111 1111 1111 1111 1111 1111 1110 取反(不包含符号位)
       = 1000 0000 0000 0000 0000 0000 0000 0001
发表于 2021-07-27 10:56:08 回复(0)
计算机里整数存储为二进制补码,计算也是对补码计算
例:0 原码:0000 补码:0000 对补码取反得到新的补码:1111 转换为原码:1001 输出:-1
例:-6 原码:1110 补码:1010 对补码取反得到新的补码:0101 转化为原码:0101 输出:5
规律为 ~n =  -(n+1) 
发表于 2020-11-14 11:45:19 回复(0)
对于任意整型数n的按位取反公式为:~n=-(n+1)
发表于 2020-05-01 15:46:25 回复(0)
补码存储
发表于 2020-04-17 21:12:32 回复(0)
~就是按位取反,0是32位全为0,按位取反后32位全为1,i又是有符号的整型,那么32位全为1作为补码的原码是-1
发表于 2020-03-31 00:15:51 回复(0)

i取反后,四字节32位全是1,因为计算机是以补码表示,所以这个是补码,我们要转为源码。 方法是符号位不变,减一取反。 所以就是-1

发表于 2020-03-07 09:45:15 回复(0)
00000000求反111111111 11111111补码是10000001 = -1
发表于 2020-02-15 18:17:31 回复(0)
对于任意整型数n的按位取反公式为:~n=-(n+1)
发表于 2020-01-14 17:51:42 回复(0)
正数和0的原码反码补码,数值位(后31位)都是自身的二进制表示,符号位(最高位)为0。 负数的原码,数值位(后31位)为自身的二进制表示,符号位(最高位)为1。 负数的反码,数值位(后31位)为其原码的数值位按位取反,符号位(最高位)为1。 负数的补码,数值位(后31位)为其反码的数值位+1,符号位(最高位)为1。 负数原码数值位十进制形式范围为1~2^31-1,按位取反成其反码数值位,范围为
发表于 2019-04-21 20:52:04 回复(2)
对于任意整型数n的按位取反公式为:~n=-(n+1)
发表于 2018-09-29 01:42:47 回复(0)
以一字节为例,你先赋值i=0,则i的内存空间形态是00000000,然后作i=~i,表示按位取反,内存空间变为11111111,这是-1的补码,所以用整型输出就是-1了
发表于 2018-07-19 21:51:54 回复(0)
0取反11111111111111111111111111111111
11111111111111111111111111111111 是补码, 有因为int i=0;是有符号的(无符号的是unsigned int),所以我们按照有符号的来求源码,
又因为最高位是1,是负数,我们求出10000000000000000000000000000001 源码, 结果是-1
源码与补码转换:源码符号位不变,求反 + 1 就是补码。同理补码转源码也是。

发表于 2018-01-26 09:40:58 回复(0)
按位取反,符号位记得也要取反
发表于 2018-01-24 22:13:52 回复(0)
负数在计算机中以补码形容存在
发表于 2017-10-01 10:01:35 回复(0)