相关疑难解决方法(0)

如果2 ^ 32位= 4亿位而不是字节,32位如何处理4GB?

从本质上讲,4Gb如何变成4GB?如果内存是寻址字节,那么可能性不是2 (32/8)

cpu-architecture addressing memory-address

4
推荐指数
1
解决办法
1542
查看次数

为什么C/C99标准的作者没有为sizeof浮点类型指定..standard?

我注意到在windows和linux x86上,float是4bytes,double是8,但long xins分别是x86和x86_64上的12和16.C99应该用特定的整体尺寸打破这种障碍.

最初的技术限制似乎是由于x86处理器无法处理超过80位的浮点运算(加上2个字节来进行舍入),但为什么标准与int类型相比不一致?他们为什么不至少达到80bit标准化?

c programming-languages c99

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

printf() 在 C 中分配内存吗?

这个简单的方法只是创建一个动态大小为 n 的数组,并用值 0 ... n-1 对其进行初始化。它包含一个错误,malloc() 仅分配 n 而不是 sizeof(int) * n 字节:

int *make_array(size_t n) {
    int *result = malloc(n);

    for (int i = 0; i < n; ++i) {
        //printf("%d", i);
        result[i] = i;
    }

    return result;
}

int main() {
    int *result = make_array(8);

    for (int i = 0; i < 8; ++i) {
        printf("%d ", result[i]);
    }

    free(result);
}
Run Code Online (Sandbox Code Playgroud)

当您检查输出时,您会发现它会按预期打印一些数字,但最后的数字是乱码。然而,一旦我在循环中插入 printf() ,输出就出奇地正确,尽管分配仍然是错误的!是否有某种与 printf() 相关的内存分配?

c malloc printf heap-memory format-string

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

一个字节中的位数 - C 标准

为什么像字节中的位数这样基本的东西仍然由 C 标准实现定义?有没有这可能有用的例子?

从 C99,3.6(可在此处链接

3.6 字节

数据存储的可寻址单元足够大,可以容纳执行环境基本字符集的任何成员

注 1:可以唯一地表达对象的每个单独字节的地址。

注 2:一个字节由连续的位序列组成,其数量由实现定义。最低有效位称为低位;最高有效位称为高位。

编辑:我问的是一些基本问题,为什么 C 标准在字节大小的位数方面提供了灵活性。不更具体地询问 sizeof(char) CHAR_BIT != 8 有什么好处。如果问题仍然看起来重复,请否决它,我将关闭问题。

c implementation-defined-behavior

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

为什么 char16_t 被定义为与 uint_least16_t 而不是 uint16_t 具有相同的大小?

阅读 C++17 草案 §6.9.1/5:

类型char16_tchar32_t分别表示不同类型的具有相同的大小,符号性,和对准如uint_least16_tuint_least32_t,分别在<cstdint>被称为底层类型。

现在参考 C11 草案 §7.20.1.2/2,这是 C 库继承的参考:

typedef 名称uint_leastN_t指定宽度至少为N 的无符号整数类型,这样具有较小大小的无符号整数类型至少具有指定的宽度。因此,uint_least16_t表示宽度至少为 16 位的无符号整数类型。

注意“至少”部分。这意味着char16_t实际上可能有例如 32 位,从而形成char16_t一个 UTF-16 原始数据的错误表示的数组。在这种情况下,将此类数组写入二进制文件将导致有效代码单元与 U+0000 字符交替。

是否有充分的理由char16_t根据uint_least16_t而不是来定义uint16_t?或者它只是标准中的一个缺陷?

c++ unicode types utf-16

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

故意价值溢出安全吗?

这个问题可能是愚蠢或偏执的,但无论如何:-).给出以下代码:

DWORD hiRes;

// will overflow about once in an hour
hiRes = GetTickCount() * 1193L;
Run Code Online (Sandbox Code Playgroud)

如果知道hiRes周期性溢出并且这种情况得到妥善处理,那么这段代码有什么问题吗?

更新: 结果对我来说非常令人惊讶,因为答案取决于hiRes(有符号或无符号)的类型,它由C标准定义(参见例如).

c windows integer-overflow

2
推荐指数
1
解决办法
207
查看次数

每个 C 数据类型的大小都保证是字节的整数倍吗?

我知道 sizeof(char) 将始终为 1,并且这是以字节为单位的,并且一个字节可以是任意数量的位(我相信大于或等于 8 的任意数量的位,但不是正数) )。

我还经常看到提到如何根据 C 数据类型大小之间的关系来指定 C 数据类型大小的参考资料,例如“sizeof(int) <= sizeof(long)”。

我的问题基本上是:在一个字节为 8 位、一个 int 为 39 位(或其他不能被 CHAR_BIT 整除的值)的系统上,“sizeof(int)”的计算结果是什么。

我的猜测是 sizeof() 返回存储类型所需的最小字节数,因此它会向上舍入到下一个字节。因此,在我的 39 位 int 示例中,sizeof(int) 的结果将为 5。

它是否正确?

另外,是否有一种简单的方法来确定特定类型可以容纳的位数,该方法是 100% 可移植的并且不需要包含任何标头?这更多的是一种学习体验,而不是实际应用。我在实践中只使用 stdint 类型。我在想也许是声明变量并将其初始化为~0,然后循环并左移直到它为零。

谢谢!

c c89 c11

2
推荐指数
1
解决办法
1097
查看次数

&lt;stdint.h&gt; 还是标准类型?

在 Linux 上编程 C++ 时应该使用哪些类型?使用类型 from 是否是个好主意stdint.h,例如int16_tand uint8_t

一方面,肯定stdint.h无法在 Windows 上进行编程。另一方面,short在第一批眼睛上,eg 的大小并不清楚。而且写起来更直观,int8_t而不是char......

C++ 标准是否保证标准类型的大小在未来不会改变?

c++

2
推荐指数
1
解决办法
1898
查看次数

为什么不能安全地转换指向数字类型的指针?

考虑这段代码

T* pa = new T(13);
int address = reinterpret_cast<int>(pa);
Run Code Online (Sandbox Code Playgroud)

其中T可以是任何内置类型.

1)我无法理解重新诠释这里有什么问题?

2)这种铸件会导致不确定的行为的情况是什么?

3)将pa始终包含内存地址的正确十进制表示?

c++ pointers casting c++11

2
推荐指数
1
解决办法
107
查看次数

字节的大小可以大于八位字节8位

我正在浏览http://www.parashift.com/c++-faq/index.html,在那里我发现该字节也可以是64位http://www.parashift.com/c++-faq/very-large- bytes.html.是否有可能以及一个字节的大量存储容量的用途是什么?

c++ byte

0
推荐指数
1
解决办法
285
查看次数

在C语言中,我可以通过堆栈指针访问另一个函数中的main函数的局部变量吗?

我需要访问main函数中定义的变量a的值,而不将其作为参数传递.

main()
{
    int a=10;

    func();

    printf("%d\n",a);
}

void func(){
//i need access of variable a here.
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

c stack gcc stack-pointer

0
推荐指数
1
解决办法
1356
查看次数

为什么va_arg()会对x86_64和arm产生不同的影响?

代码:

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

typedef unsigned int uint32_t;

float average(int n_values, ... )
{
    va_list var_arg; 
    int count;
    float sum = 0;

    va_start(var_arg, n_values);

    for (count = 0; count < n_values; count += 1) {
        sum += va_arg(var_arg, signed long long int);
    }   

    va_end(var_arg);

    return sum / n_values;
}

int main(int argc, char *argv[])
{
    (void)argc;
    (void)argv;

    printf("hello world!\n");

    uint32_t t1 = 1;  
    uint32_t t2 = 4;  
    uint32_t t3 = 4;  
    printf("result:%f\n", average(3, t1, t2, t3));

    return …
Run Code Online (Sandbox Code Playgroud)

c x86 gcc arm x86-64

0
推荐指数
1
解决办法
210
查看次数

C编程 - 指针地址字节拆分

我有以下变量var,它是一个无符号的32位值.我正在研究一个小端系统.

unsigned long var = 1;
// Representation: 00000000 00000000 00000000 00000001
Run Code Online (Sandbox Code Playgroud)

现在我想通过以下方式访问第一个和最后一个16位:

(((unsigned short*)&var)[0])) => 00000000 00000001

(((unsigned short*)&var)[1])) => 00000000 00000000
Run Code Online (Sandbox Code Playgroud)

这种类型的指针地址类型拆分是否有任何C文档?我得到了这个工作,但我不知道这是如何工作的.

谢谢

c pointers

-1
推荐指数
1
解决办法
60
查看次数