[C/C++]如何将一个无符号整型所有数据位置为1

正解「x = -1;」

-1超出无符号整型x的表达范围,根据标准(C++11 section 4.7.2),-1将被转化为2^n-1(n为x的bit数)。

不正解 「x = 0xFFFFFFFF;」

这只适用于32bit整型。

不正解「x = ~0;」

这个被很多书认定为「标准答案」的解答也是错的。C/C++标准支持原码/反码/补码三种负数表示形式,只有在补码环境下才会得到正确结果。(例如在反码下,~0将得到-0,-0转为无符号仍然是0)

那么x = ~0u呢?

仍然是错的。根据标准(C++11 section 2.14.2.2),字面量0u是unsigned int。那么取反后得到的是UINT_MAX,如果x可表示的最大值不是UINT_MAX那么结果就是错的。

时间: 2024-10-13 12:17:31

[C/C++]如何将一个无符号整型所有数据位置为1的相关文章

无符号整型指定比特位置1

将无符号数的指定比特进行置1.输入数字n(31bit,无符号整形),置为数m(0<=m<=31). 输入:无符号数,指定bit位 输出:指定的bit位被置1的值 例如:输入 891 7 输出 1019 1 #include <stdio.h> 2 #include <stdlib.h> 3 int main(void) 4 { 5 unsigned int c, tmp; 6 int d; 7 while (1) 8 { 9 scanf("%d%d"

有符号和无符号整型数字

8位无符号整型:0 -> 25511111111     255...10000000     12801111111     127...00000000       0 8位有符号整型:-128 -> 12701111111    127...00000000      011111111     -1        取反加一...10000000   -128        取反加一

uint8是8位无符号整型,uint16是16位无符号整型。

整型有无符号(unsigned)和有符号(signed)两种类型,在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned.在一些不可能取值为负数的时候,可以定义为unsigned,在一些底层的嵌入式编程的数据一般都是无符号. 向左转|向右转 扩展资料: 负数时的有符号整型和无符号整型的转换 当执行一个运算时(如这里的a>b),如果它的一个运算数是有符号的而另一个数是无符号的,那么C语言会隐式地将有符号 参数强制类型为无符号数,并

【C语言位运算的应用】如何按bit位翻转一个无符号整型

其实现思路如下: 将目标数值进行末尾比特位摘取,将所摘取的bit位放到一个相同类型的末尾,目标数值bit位右移,相同类型bit位左移. C语言的位运算符:     实现代码如下: #include <stdio.h>//按位翻转一个无符号整形 unsigned int reverse_bit(unsigned int value) { unsigned int num = 0; int i = 0; for (i = 1; i < 32; i++) { num += value &

无符号整型与有符号整型相运算规则

有符号数和无符号数运算的时候,有符号数会自动向无符号数转换 1 #include<iostream> 2 #include<ctime> 3 #include <stdio.h> 4 #include<cstring> 5 #include<cstdlib> 6 #include <map> 7 #include <string> 8 using namespace std; 9 10 #if TEST 11 int ma

无符号整型unsigned int、unsigned long、usigned long long、size_t比较和格式控制

位数比较 由于数据的长度和平台相关,所以基于 64 位系统比较. Windows Linux unsigned int 32 bits/4294967295 32 bits unsigned long 32 bits 64 bits/18446744073709551615 unsigned long long 64 bits 64 bits size_t 32 bits 64 bits 可以看到,size_t 和 unsigned long 比较同步.另外 ssize_t 和 size_t 的

关于无符号整型数中1的个数与0的个数的改变与计算引发的思考

首先可以把unsigned int数中的1的个数与0的个数改变与计算的实现: </pre><pre name="code" class="cpp">/********************************************************************** * * Copyright (c)2015,WK Studios * * Filename: A.h * * Compiler: GCC vc 6.0 *

符号整型的陷阱

//看似死循环的背后,隐藏的是符号整型的陷阱,其实我们需要从理论上证实这一点 //这不是一个死循环 #include<iostream> using namespace std; int main() {   int x;   int y=0;   for(x=0;x<10;x++)   {    y=y+x;//x累加到4的时候,程序没有达到10,与此同时,检测到y即将大于10,x相互抵消,维持原值   //导致死循环,但是居然程序能结束,太神奇了.   if(y>10)    

翻转无符号整型数据的比特位

[问题:给定无符号整型数据,需要你翻转它的比特位(依中心镜像翻转)] 这个问题有很多解决方法,这里介绍利用异或(xor)运算解决这个问题的小技巧. 提示:怎样交换第i位比特和第j位比特数据呢?试着想想怎样用异或(xor)运算实现. 异或运算技巧: 实现翻转我们需要将这个数据的前n/2(假设数据有效位数为n,二进制)有效位和后n/2有效位进行交换.写一个函数swapBits(i, j),用来交换第i位和第j位bit. 复习一下异或运算: 0 ^ 0 == 0 1 ^ 1 == 0 0 ^ 1 ==