相关疑难解决方法(0)

C++标准规定了int的大小,long类型是什么?

我正在寻找有关基本C++类型大小的详细信息.我知道这取决于架构(16位,32位,64位)和编译器.

但是有没有C++的标准?

我在32位架构上使用Visual Studio 2008.这是我得到的:

char  : 1 byte
short : 2 bytes
int   : 4 bytes
long  : 4 bytes
float : 4 bytes
double: 8 bytes
Run Code Online (Sandbox Code Playgroud)

我试图找到,但没有成功,可靠的信息,表述的大小char,short,int,long,double,float(和其他类型的我没想到的),在不同的体系结构和编译器.

c++ c++-faq

679
推荐指数
15
解决办法
120万
查看次数

120
推荐指数
7
解决办法
22万
查看次数

什么是CHAR_BIT?

引用用于计算整数绝对值(abs)的代码而不分支来自http://graphics.stanford.edu/~seander/bithacks.html:

int v;           // we want to find the absolute value of v
unsigned int r;  // the result goes here 
int const mask = v >> sizeof(int) * CHAR_BIT - 1;

r = (v + mask) ^ mask;
Run Code Online (Sandbox Code Playgroud)

专利变化:

r = (v ^ mask) - mask;
Run Code Online (Sandbox Code Playgroud)

CHAR_BIT它是什么以及如何使用它?

c bit-manipulation

86
推荐指数
3
解决办法
7万
查看次数

陷阱表示

  1. 什么是C中的陷阱表示(某些示例可能有帮助)?这适用于C++吗?

    float f=3.5;
    int *pi = (int*)&f;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编辑:我知道'pi'违反了别名规则,根据C标准它是UB.至少在海湾合作委员会它没有产生任何错误,但警告.在这个实现(即GCC)中,假设sizeof(int) == sizeof(float)do f*pi具有相同的二进制表示/模式?MSVC怎么样?

c c++ gcc visual-studio-2010

63
推荐指数
3
解决办法
1万
查看次数

隐式类型促销规则

本文旨在用作关于C中隐式整数提升的常见问题解答,特别是由通常的算术转换和/或整数提升引起的隐式提升.

示例1)
为什么这会给出一个奇怪的大整数而不是255?

unsigned char x = 0;
unsigned char y = 1;
printf("%u\n", x - y); 
Run Code Online (Sandbox Code Playgroud)

例2)
为什么这会给"-1大于0"?

unsigned int a = 1;
signed int b = -2;
if(a + b > 0)
  puts("-1 is larger than 0");
Run Code Online (Sandbox Code Playgroud)

示例3)
为什么更改上例中的类型来short解决问题?

unsigned short a = 1;
signed short b = -2;
if(a + b > 0)
  puts("-1 is larger than 0"); // will not print
Run Code Online (Sandbox Code Playgroud)

(这些示例适用于16位或短16位的32位或64位计算机.)

c type-conversion implicit-conversion

50
推荐指数
2
解决办法
7417
查看次数

Java:对负数进行右移

关于负数的右移操作我很困惑,这里是代码.

int n = -15;
System.out.println(Integer.toBinaryString(n));
int mask = n >> 31;
System.out.println(Integer.toBinaryString(mask));
Run Code Online (Sandbox Code Playgroud)

结果是:

11111111111111111111111111110001
11111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)

为什么要将负数移31而不是1(符号位)?

java bit-manipulation bit-shift bitwise-operators negative-number

24
推荐指数
2
解决办法
3万
查看次数

是否有任何现有的C实现在(un)有符号整数表示中具有填充位?

根据C99,可能有填充位signed intunsigned int表示.所以我想知道还有任何实现有这样过时的东西吗?

c c99

11
推荐指数
2
解决办法
695
查看次数

计算C中数据类型的范围

我正在研究K&R第二版,并且无法弄清楚为什么我会得到一定的结果.我正在解决的问题是计算数据类型的上限和下限.特别:

"编写一个程序来确定char,short,int和long变量的范围,包括有符号和无符号,通过从标准头文件中打印适当的值并直接计算.如果你计算它们会更难:确定各种浮动的范围 - 点类型."

我已经了解了按位运算符和两个人的称赞,并且我认为应该对签名数据类型有效,但是它适用于对我没有任何意义的无符号数据类型.这是代码:

#include <stdio.h>

main()
{
    signed int i;

    i = ~0;
    i >>= 1;
    printf("Upper limit: %d\n", i);
    printf("Lower limit: %d\n", -i -1);
}
Run Code Online (Sandbox Code Playgroud)

这将导致-1被打印为上限,0被打印为下限.但是,如果我将i更改为unsigned int,我会得到我期望的结果(2147483647和-2147483648).我无法解决这个问题,因为我的理解是unsigned int永远不会小于0,而signed int应该使用这些按位运算符,即如果它是32位系统,

~0 == 11111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)

,和

~0 >> 1 == 011111111111111111111111111111111, 
           or 2147483647.
Run Code Online (Sandbox Code Playgroud)

知道我哪里错了吗?

c

5
推荐指数
2
解决办法
5050
查看次数

C程序按位:值为-1 >> 1

对于GCC 32位,-1 >> 1返回我FFFFFFFF,但我认为在2的补码之后,我将得到0111 1111 ... 1111,这应该是7fff ffff.我错过了什么?

c bit-manipulation

3
推荐指数
1
解决办法
138
查看次数