zoukankan      html  css  js  c++  java
  • C语言的左位移能不能超过8位?

    C语言的左位移能不能超过8位?比如b=a<<20; 这样可以不?如果可以,一个字节只有8个位,左移20位是不是连右边其它字节的12个位(20-8)也一起左移?

    字符变量左移八次后,所有的位都移出去了,继续左移当然可以,但没有意义,因为左移八次后八个位都是0,再移没有意义
    追答:
    他左边的字节不受影响
    追问:
    int变量a(32个二进制位)左移25位的话,它是32个二进制位一起左移还是每8个二进制位单独左移25位?
     
    比如a<<=25  它是以全部32个位为整体一起左移25位吗?也就是32位移出去25位?
     
    还是这32位分成四个字节,然后以字节为单位,每个字节分别左移25位?
    追答:
    移位是针对所有二进制位的,不是一个字节。a<<=25 每移动一次,32个位都跟着一起向左移一位。
    追问:
    你说的char变量左移8位后就全都移出去了,再移就没有意义了因为八个位都是0
     
    但我试过了好像不是这样
     
    比如char ch=1; printf("%d",ch<<8);结果却输出256
     
    printf("%d",ch<<25);结果就输出33554432
     
    按道理char变量ch左移7位应该就是-128,再移下去就全变成0了,但实际结果却是移七位的时候还没有变成-128,而是128,再移下去不但没有变成0,反而输出结果更大。。 不知道为什么会这样
    追答:
    其实你问的是另一个问题了
     
    你以%d格式输出就不是原来的类型了
    追问:
    已经定义了char ch,就相当于定义给他分配一个字节,至于%d和%c只是把存在内存中的那串二进制以不同形式输出而已,
     
    一个char ch最大数就是01111111
     
    按道理左移八位就全部都移出去了,但实际结果不是这样
    追答:
    你写成ch<<8或ch<<25,输出的是表达式的值,而不是变量的值,在<<后面加上=看看,结果是不同的,这时输出的是变量的值
    追问:
    哦,明白了,ch<<25并不是赋值给ch
     
    谢谢你了
    提问者评价
    太给力了,你的回答完美地解决了我的问题,非常感谢!
  • 相关阅读:
    Socket经验记录
    有了WCF,Socket是否已人老珠黄?
    更新Svn客户端后,右键菜单中没有TortoiseSVN了
    线程已被中止 “Thread was being aborted”
    c# 温故而知新: 线程篇(一)
    SOCKET是多线程安全的吗? [问题点数:40分,结帖人CSDN]
    <base href=""/> 的应用
    Python Twisted 框架中 socket通信
    本人作品-〉VPS应用>Discuz网页斗地主插件
    浅析 c# Queue
  • 原文地址:https://www.cnblogs.com/lidabo/p/4573270.html
Copyright © 2011-2022 走看看