首页
学习
活动
专区
工具
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)>>, >>= 运算有时依赖于符号位。

37830

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

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

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

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

    78011

    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.6K30

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

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

    64920

    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++的朋友来说,非常简单

    50020

    位操作符的运算与类型

    位操作符:位操作符是对字节或字中的位进行测试、置位或移位处理 啊?位操作符?????看不懂?这是啥捏??(是不是有这样的疑问) 别急,我来说,二进制会吧?0与1的或(||)与(&&)会吧?...(1)&的运算 1000 1000 & 1000 0001 = 1000 0000;你是不是很奇怪,这咋运算的?...1001 2.左移和右移运算 1.整数运算 左移:将变量的各位按要求向左移动若干位。...还是画图给你说 看着是1往左移动了3位,其实是整体移动了三位,在空出的位置补的0 这就是左移,左移空出的位置补的一定是0; 但右移哪?...[1111 1110]反= [1111 1111]补 所以你懂了吧 用补码运算 运算完之后,在进行还原 还原之后的十进制就是结果

    6910

    开心档之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

    23230

    开心档之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

    24410

    C++移位运算符

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

    69110

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

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

    75930

    【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 C++ 的方式在控制台输出文本 // cout 的作用是进行标准输出 , 向控制台输出内容 // C++ 中的 左移操作符 << // 在 C++ 语言中进行了操作符重载 进行了功能增强

    32220

    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.3K20

    7-5 字符串循环左移

    点这里 7-5 字符串循环左移 输入一个字符串和一个非负整数N,要求将字符串循环左移N次。 输入格式: 输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。...输出格式: 在一行中输出循环左移N次后的字符串。 输入样例: Hello World! 2 输出样例: llo World!...让我左移俩就把前俩剪了就行了,剩下的输出,再把剪下的俩输出出来 对对对,别忘了,输进来的有空格, cin这货不靠谱,要用getline(cin,s); 刚学完C又学了substr的我 C++中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的末尾

    91420

    初识c++:入门基础

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

    7210

    【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++ 中的封装实现。

    11610

    数值问题

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

    20000

    【优选算法篇】微位至简,数之恢宏——解构 C++ 位运算中的理与美

    我们会一步步揭开位运算的面纱,透过 C++ 语言的语法与语义,看见算法设计中隐藏的巧思与哲理。...原因是: 在 C++ 中,带符号整数(int)在左移时,若超过其表示范围,可能导致未定义行为。...而 unsigned int 在左移超过范围时,则会进行模 (2^{32}) 运算,这样可以保证结果在范围内“循环”。 这种处理方式可以确保即使位运算结果溢出,程序仍然能够稳定地获得正确的结果。...例如,a = 0x40000000 和 b = 0x40000000(即 1073741824)在左移后超出 int 范围时,unsigned int 可以保证结果循环到范围内,而不会产生未定义行为。...循环的边界条件: 确保循环遍历每一位时,处理负数时的位运算没有产生意外结果。

    9210
    领券