首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C++中将64位值向左移64位会产生奇怪的结果

在C++中,将64位值向左移64位会产生奇怪的结果,因为这将导致所有位都向左移动,从而使原始值丢失。在C++中,位移操作会根据操作数的位数进行取模,因此在64位系统中,向左移位操作实际上是对64位值进行取模操作,即移位位数对64取模。因此,向64位值左移64位将导致所有位都向左移动64位,从而使原始值丢失。

例如,假设有一个64位值为0x123456789abcdef0。向左移64位后,结果将为0x123456789abcdef0 << 64,即0x123456789abcdef0。但是,由于C++对位移操作进行取模操作,实际上执行的是0x123456789abcdef0 << (64 % 64) = 0x123456789abcdef0 << 0,结果将为0。因此,将64位值向左移64位将导致结果为0。

在实际编程中,如果需要将64位值向左移位,应该注意移位位数不能超过64位的位数,以避免出现奇怪的结果。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

php 0xffffffff,0xffffffff – 依睛(IT blog) 我回来了,PHPCC++ LINUX – IT博客「建议收藏」

所以左移32位后,我认为int变量应该被清0了。但输出结果却不一致,更奇怪是debug/release输出也不相同。...解答: 仔细看了一下C/C++ Standard和MSDN,原来是我对位移操作理解不够完备所致。 1. 所有的位移操作右操作数必须小于左操作数位长度,否则结果未定义。 2....操作过程当中,有可能产生Integral Promotions。这就比较复杂了。C++中采用和C相同策略,提升后量总是“保值”,即原有的bit不变;但不一定是“保号”。...运算中,如果char/bit field不能保持全部,就会被提升到int型,如果int也不能保存全部就会被提升至unsigned。...有几种罕见情况,保值和保号运算导致不同: (1) /, %, /=, %=, , >=运算依赖于符号,应用时可能导致不同结果。(2)>>, >>= 运算有时依赖于符号位。

36830

C++】运算符重载 ⑧ ( 左移运算符重载 | 友元函数 成员函数 实现运算符重载 | 类对象 使用 左移运算符 )

一、左移运算符重载 1、友元函数 / 成员函数 实现运算符重载 运算符重载 正规写法一般都是 使用 成员函数 形式 实现 ; 加法 + , 减法 - , 自增 ++ , 自减 - - , 一般都使用成员函数...成员函数 进行重载 ; 只能使用 友元函数 重载运算符 : 无法修改 左操作数 情况下 , 只能使用 全局函数 ( 需声明 友元函数 ) 进行重载 ; 2、类对象 使用 左移运算符 平时使用 cout...与 左移操作符 << 命令行输出数据时 , 只能输出 基础数据类型 和 字符串 ; cout << "age = " << age << endl; 如果 , 想要输出 自定义类对象 , 直接使用下面的代码...引用类型 , 是为了支持链式调用 cout << s1 << endl; ostream& operator<<(ostream& out, Student& s) { // <em>在</em>函数体<em>中将</em> Student...返回 ostream& 引用类型 , 是为了支持链式调用 cout << s1 << endl; ostream& operator<<(ostream& out, Student& s) { // <em>在</em>函数体<em>中将</em>

25710
  • Java编程思想第五版精粹(四)-运算符

    (非)根据参数逻辑关系生成布尔 true 或 false。 Java 逻辑运算中,不能像 C/C++ 那样使用非布尔, 而仅能使用 AND、 OR、 NOT。...“短路”(short-circuiting) 整个表达式会在运算到可以明确结果时就停止并返回结果,这意味着该逻辑表达式后半部分不会被执行到 2.5 字面值常量(Literal) 程序中插入一个字面值常量时...,从而产生结果。...只能用于处理整数类型 左移位运算符 << 能将其左边运算对象向左移动右侧指定位数(低位补 0) 右移位运算符 >> 则相反,右移位运算符有“正”、“负”:若为正,则在高位插入 0;若为负,则在高位插入...若想重新使用较小类型,必须使用强制转换(由于重新分配回一个较小类型,结果可能丢失精度)。Java 不需要 sizeof() 方法,因为所有类型大小不同平台上是相同

    77311

    【每日算法Day 66】经典面试题:不用四则运算如何做加法?

    但是这样一位一位模拟不方便实现,更简单实现方法是直接把两个数对应位相加,不管进位。然后进位单独计算,如果某一位两个数都是 ,那么进位就会对下一位产生影响。...然后接着算不进位求和加上进位,再计算新进位,依次重复下去,直到进位为 为止。...用一个实际例子来演示一下,计算 ,其中 表示每一步不考虑进位求和, 表示每一步进位,最后得到结果 ,也就是十进制 : ? 但是这里还是用到了加法怎么办呢?...而计算进位的话,直接用位与和左移一位就行了。 c++ 和 python 具体实现中,还有几个注意事项: LeetCode c++ 不允许负数左移操作,所以要转换成无符号整数。...c++ 还可以写成递归形式,也就是 可以递归成 ,其中 表示不进位求和结果, 表示进位

    63720

    C++运算符优先级

    C++运算符优先级,是描述计算机运算计算表达式时执行运算先后顺序。 先执行具有较高优先级运算,然后执行较低优先级运算。 例如,我们常说先执行相乘和除,再执行加减运算。...0; } 当上面的代码被编译和执行时,它会产生下列结果: Line 1 - c 是 12 Line 2 - c 是 61 Line 3 - c 是 49 Line 4 - c 是 -61...,逗号运算符顺序执行一系列运算。整个逗号表达式是以逗号分隔列表中最后一个表达式。.(点)和->(箭头)成员运算符用于引用类、结构和共用体成员。...杂项运算符实例: 请看下面的实例,了解 C++ 中运算符优先级,复制并黏贴下面的 C++ 程序到 test.cpp 文件中,编译并运行程序即可。 对比有括号和没有括号时区别,这将产生不同结果。...} 当上面的代码被编译和执行时,它会产生下列结果: (a + b) * c / d 是 90 ((a + b) * c) / d 是 90 (a + b) * (c / d) 是 90 a

    4.4K30

    C++之标准库学习总结

    一、标准库“引子”: 1、操作符"<<"原生意义是按位左移,例如: 1<<2 它意义是将整数1按位左移2位,即: 0000 0001 演变成 0000 0100 重载左移操作符,将变量或者常量左移到一个对象中.../a.out 1 TXP 0.300000 从上面我们可以看到,不直接使用printf函数去打印这个,这个以前书上,都是直接讲解把数值说送到输出流中去,但是你一开始学习cout函数(或者说你还没有接触到对象时候...,根本不明白这什么意思);如果进行了左移重载之后,那么程序将产生神奇变化,所以 main() 中不用 printf() 和格式化字符串 '\n' 了,因为编译器会通过重载机制会为我们选择究竟使用哪一个重载机制...二、c++标准库: 1、标准库特性: C++标准库并不是C++语言一部分 C++标准库是由类库和函数库组成集合 C++标准库中定义类和对象都位于std命名空间中 C++标准库头文件都不带.h后缀...三、总结: C++标准库是由类库和函数库组成集合 C++标准库包含经典算法和数据结构实现 C++标准库涵盖了C库功能 C++标准库位于std命名空间中 本期内容对于接触过C++朋友来说,非常简单

    48420

    开心档之C++ 运算符

    c << endl ; return 0; } 当上面的代码被编译和执行时,它会产生以下结果: Line 1 - c 是 31 Line 2 - c 是 11 Line 3 - c 是...endl ; return 0; } 当上面的代码被编译和执行时,它会产生以下结果: Line 1 - = 运算符实例,c = 21 Line 2 - += 运算符实例,c =...下表将按运算符优先级从高到低列出各个运算符,具有较高优先级运算符出现在表格上面,具有较低优先级运算符出现在表格下面。表达式中,较高优先级运算符优先被计算。...复制并黏贴下面的 C++ 程序到 test.cpp 文件中,编译并运行程序。 对比有括号和没有括号时区别,这将产生不同结果。...< endl ; return 0; } 当上面的代码被编译和执行时,它会产生以下结果: (a + b) * c / d 是 90 ((a + b) * c) / d 是 90 (a

    22630

    开心档之C++ 运算符

    c << endl ; return 0; } 当上面的代码被编译和执行时,它会产生以下结果: Line 1 - c 是 31 Line 2 - c 是 11 Line 3 - c 是...endl ; return 0; } 当上面的代码被编译和执行时,它会产生以下结果: Line 1 - = 运算符实例,c = 21 Line 2 - += 运算符实例,c =...下表将按运算符优先级从高到低列出各个运算符,具有较高优先级运算符出现在表格上面,具有较低优先级运算符出现在表格下面。表达式中,较高优先级运算符优先被计算。...复制并黏贴下面的 C++ 程序到 test.cpp 文件中,编译并运行程序。 对比有括号和没有括号时区别,这将产生不同结果。...< endl ; return 0; } 当上面的代码被编译和执行时,它会产生以下结果: (a + b) * c / d 是 90 ((a + b) * c) / d 是 90 (a

    23910

    C++移位运算符

    而IntelCPU执行shl指令时,先将cl与31进行and操作,以限制左移次数小于等于31。因为35 & 31 =3,所以这样指令相当于将1左移3位,结果是8。...而j=1<<35;一句是常数运算,VC即使不做优化,编译器也直接计算1<<35结果。VC编译器发现35大于31时,就会直接将结果设置为0。...这行代码编译产生机器指令是: mov dword ptr [j],0 对上面这两种情况,如果把VC编译器优化开关打开(比如编译成Release版本),编译器都会直接将结果设置为0。...所以,C/C++语言中,移位操作不要超过界限,否则,结果是不可预期。...result^=(1<<27) //任意与1作按位异或操作其为1,而与0作按位异与操作其不变 二、C++bitset容器 1.头文件: #include 2.声明一个容器

    67810

    千万别小看这些运算符背后逻辑

    原创@飞白 前言 最近回顾javascript一些基础知识点时,引起思考确实颠覆了我之前一些认知。我清楚地记得曾多次在网上看到一些奇奇怪表达式,它们运算结果着实让人懵逼。...如果操作数是对象,转换为原始(一般是先调用valueOf(),日期对象比较特殊,会调用toString()),得到原始不再被强制转换为数字或字符串。...在这种约束下,对象转为原始基本都是字符串(如果你没有重写valuOf()或者toString()方法),根据下面的第四点,执行字符串拼接操作。...var a = -1; a >> 2; // -1 // 如果用负数补码形式进行算术右移,高位补1 如果你自己写几个右移运算表达式做试验,你就会产生一个疑惑,为什么有的正数带符号右移后却变成了负数...而214748364832位带符号正数中是无法表示,其已经溢出了。 ?

    75630

    C++】标准流与命名空间简介 ( Visual Studio 2019 中创建 C++ 项目 | iostream 标准流 | std 标准命名空间 | cout 控制台输出 )

    C 语言中 , 使用 printf 函数 , 就可以控制台输出数据 , C++ 中仍然可以使用这种方式 ; // 使用 C 语言方式控制台输出文本 printf("printf Hello..., 控制台输出内容 ; 左移操作符 << 操作符 , 用于将右侧 字符串内容数据 发送到左侧流中 , 也就是将 "cout Hello World" 字符串数据发送到 cout 标准输出流中 ;...endl 操作符 作用是 刷新输出流 , 将内容打印到控制台 并且回车换行 ; // 使用 C++ 方式控制台输出文本 // cout 作用是进行标准输出 , 控制台输出内容 //...C++ 左移操作符 << // C++ 语言中进行了操作符重载 进行了功能增强 // endl 作用是 将内容打印到控制台 并且回车换行 cout << "cout Hello...C++ 方式控制台输出文本 // cout 作用是进行标准输出 , 控制台输出内容 // C++ 左移操作符 << // C++ 语言中进行了操作符重载 进行了功能增强

    29820

    JAVA中有趣移位操作

    << 左移二进制格式下,把所有的数字向左移动指定位数,左边高位移出(舍弃),右边低位多出来空位补0。...如果觉得奇怪,想想有时候我们遇到过场景:一个很大int正数,乘一个正数后如果结果超过了int能存储极限,往往就变成了负数,或者一个很小正数。...1,变成了负数 System.out.println("x左移1位\t= " + (x << 1)); // 就像乘2如果超过了int最大变成负数,结果是一样一样...左移1位 -6 */ >> 右移位 二进制格式下,把所有的数字向右移动指定位数,低位移出(舍弃),高位空位补符号位,即正数补0,负数补1(想想负数存补码和原码是不同)。...以int为例,如果直接左移36位,结果并不是0,而是等同于左移36%32=4位。 右移和无符号右移也同样适用。

    1.5K30

    为什么(2.55).toFixed(1)等于2.5?

    正文从这里开始~~ 上次遇到了一个奇怪问题:JS(2.55).toFixed(1)输出是2.5,而不是四舍五入2.6,这是为什么呢? 进一步观察: ?...一般系统上int为32位,使用前面的31位表示整数(包括正负符号),而如果是64位的话,使用前32位表示整数。...它指数位是1,所以把这个数左移一位就得到数b: 10.1000110011... a原本是52位,左移1位就变成了53位数,再把b右移52 - 1 = 51位就得到整数部分为二进制10即十进制2...再用b减掉10左移51位,就得到了小数部分。...C/C++/Java/Mysql里面char是使用单引号表示一种变量,用一个字节表示ascii符号,存储实际是它ascii编码,所以可以和整数相互转换,如'0' + 1就得到'1'。

    1.2K20

    7-5 字符串循环左移

    点这里 7-5 字符串循环左移 输入一个字符串和一个非负整数N,要求将字符串循环左移N次。 输入格式: 输入第1行中给出一个不超过100个字符长度、以回车结束非空字符串;第2行给出非负整数N。...输出格式: 一行中输出循环左移N次后字符串。 输入样例: Hello World! 2 输出样例: llo World!...让我左移俩就把前俩剪了就行了,剩下输出,再把剪下俩输出出来 对对对,别忘了,输进来有空格, cin这货不靠谱,要用getline(cin,s); 刚学完C又学了substrC++中substr...解释:返回一个string,包含s中从pos开始n个字符拷贝(pos默认是0,n默认是s.size() - pos,即不加参数默认拷贝整个s) 3....补充:若pos超过了string大小,则substr函数抛出一个out_of_range异常;若pos+n超过了string大小,则substr会调整n,只拷贝到string末尾

    89820

    初识c++:入门基础

    二.命名空间 namespace 命名空间价值 C/C++中,变量、函数和后⾯要学到类都是⼤量存在,这些变量、函数和类名称将都存在于全 局作⽤域中,可能导致很多冲突。...使⽤命名空间是对标识符名称进⾏本地化,以避免命名 冲突或名字污染,namespace关键字出现就是针对这种问题 以前写c程序时我们遇到这样问题: #include <stdio.h...(C语⾔还⽤这两个运算符做位运算左移/右移) • 使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++输⼊ 输出可以⾃动识别变量类型(本质是通过函数重载实现...• IO流涉及类和对象,运算符重载、继承等很多⾯对象知识,这些知识我们还没有讲解,所以这 ⾥我们只能简单认识⼀下C++ IO流⽤法,后⾯我们会有专⻔⼀个章节来细节IO流库。...调⽤该函数时,如果没有指定实参 则采⽤该形参缺省,否则使⽤指定实参,缺省参数分为全缺省和半缺省参数。

    6510

    C++位图】构建灵活空间效率工具

    本文中,我们将深入探讨如何在 C++ 中封装位图数据结构,重点介绍其基本操作、性能优化以及实际应用。通过封装,我们不仅可以提高代码可读性和可维护性,还能为后续功能扩展打下坚实基础。...j位标记为1 //bs或等于1左移七位 _bs[i] |= (1 << j); } 先将给定数位置算出来,i表示第几个int,j表示比特位第多少位。...由于这里我们需要将第j位设置为1,而且不能动其他位,所以可以想到位运算(|),先将1左移j位(左移不是表示向左移动,而是表示低位高位移动),由于两个数进行按位或运算是如果有1结果就是1,0|1也是1,0...j = x % 32; //取到j位置 return _bs[i] & (1 << j); } private: //C/C++中定义最小单位是一个字节 //一个int是32个位...std::vector _bs; }; 总结 本文中,我们深入探讨了位图数据结构基本概念及其 C++封装实现。

    9510

    数值问题

    位截断,长数短数转化时会发生截断,规则比较粗暴简单,直接“砍掉”高位,留下低位即可。 长数表示范围肯定大于短数,所以截断一个数可能会改变原来。...这在32位 int 型,64位 long long 情况下成立,但是 short 情况下不成立。所以 c 里面关于数值东西有许多奇奇怪东西,诸位感兴趣可以去尝试。...乘以 2n 相当于左移 n 位,除以 2n 相当于右移 n 位。 左移需要注意高位溢出问题,而右移则需要注意舍入问题。一般舍入规则是0舍入,但用移位来实现除法是向下舍入。...只要粘位右边有任何非0数就置1,否则置0。 5、阶码溢出判断 结果阶码全 1 表上溢,产生异常或者结果置为∞。...计算机里面有关数值问题有很多,不仅计算机本身有一套规则,各语言编译器也有自己规则,里面的弯弯绕绕很多,造成各种奇奇怪问题。

    19500

    murmurhash算法_自我介绍方式

    即:给定散列h很难找到消息m;很难找到产生相同哈希消息m1和m2。 非加密哈希函数只是试图避免非恶意输入冲突。作为较弱担保交换,它们通常更快。...Smhasher-评价哈希算法函数 评价一个哈希算法好坏,人们通常会引用 SMHasher 测试集运行结果。...MurmurHash3可以产生32位或128位哈希,旧版本MurmurHash2产生32位或64位,MurmurHash2A变体添加了Merkel-Damgard构造,以便可以逐步调用它。...C++实现,但是有多种流行语言有效移植,已被很多开源项目采用。...MM通过了卡方检验和雪崩测试 Avalanche Test(雪崩测试) 这意味着输入微小变化导致输出发生显著变化,使其统计上看起来与随机变化没有差别。

    2.3K20

    C++位运算符

    位运算是指按二进制进行运算。系统软件中,常常需要处理二进制位问题。C语言提供了6个位操作运算符。...1,该位结果为1。...0 0 1 1 0 0 0 0 (060) | 0 0 0 0 1 1 1 1 (017) = 0 0 1 1 1 1 1 1 (077) C++源代码: 编译执行代码得到结果为: 应用:按位或运算常用来对一个数据某些位定为...例如:~77(8) 源代码: 编译执行之后得到结果如下: 6、左移运算符(<<) 左移运算符是用来将一个数各二进制位左移若干位,移动位数由右操作数指定(右操作数必须是非负值),其右边空出位用0...源代码: 编译执行后得到如下结果左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,15 << 2=60,即乘了4 。但此结论只适用于该数左移时被溢出舍弃高位中不包含1情况。

    1.2K30
    领券